summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWaldemar Brodkorb <wbx@openadk.org>2013-05-02 09:45:18 (GMT)
committerWaldemar Brodkorb <wbx@openadk.org>2013-05-02 09:45:18 (GMT)
commite85fa91ec6655da593c0b8b31832045da5ad9ad4 (patch)
tree2e3ea23d1697b2b9e11ed00023783f9722dcf276
parent5782397d77cd243c1174c98051158febe3a21641 (diff)
update Xorg to 7.7
-rw-r--r--Config.in6
-rw-r--r--Makefile1
-rw-r--r--mk/kernel-ver.mk6
-rw-r--r--mk/mirrors.mk6
-rw-r--r--package/MesaLib/Makefile48
-rw-r--r--package/MesaLib/patches/000-mesalib-xdemos.patch14774
-rw-r--r--package/MesaLib/patches/patch-bin_mklib19
-rw-r--r--package/MesaLib/patches/patch-configs_default11
-rw-r--r--package/MesaLib/patches/patch-include_GL_internal_sarea_h12
-rw-r--r--package/MesaLib/patches/patch-src_glsl_Makefile17
-rw-r--r--package/MesaLib/patches/patch-src_glsl_apps_Makefile15
-rw-r--r--package/MesaLib/patches/patch-src_mesa_Makefile21
-rw-r--r--package/MesaLib/patches/patch-src_mesa_drivers_dri_savage_savageioctl_c10
-rw-r--r--package/MesaLib/patches/patch-src_mesa_main_imports_c17
-rw-r--r--package/MesaLib/patches/patch-src_mesa_shader_slang_library_Makefile11
-rw-r--r--package/bigreqsproto/Makefile4
-rw-r--r--package/compositeproto/Makefile4
-rw-r--r--package/damageproto/Makefile4
-rw-r--r--package/dri2proto/Makefile4
-rw-r--r--package/fixesproto/Makefile4
-rw-r--r--package/font-adobe-100dpi/Makefile4
-rw-r--r--package/font-adobe-75dpi/Makefile4
-rw-r--r--package/font-bh-100dpi/Makefile4
-rw-r--r--package/font-bh-75dpi/Makefile4
-rw-r--r--package/font-bh-lucidatypewriter-100dpi/Makefile4
-rw-r--r--package/font-bh-lucidatypewriter-75dpi/Makefile4
-rw-r--r--package/font-bh-ttf/Makefile4
-rw-r--r--package/font-bitstream-100dpi/Makefile4
-rw-r--r--package/font-bitstream-75dpi/Makefile4
-rw-r--r--package/font-bitstream-type1/Makefile4
-rw-r--r--package/font-misc-misc/Makefile4
-rw-r--r--package/font-xfree86-type1/Makefile4
-rw-r--r--package/fontsproto/Makefile4
-rw-r--r--package/glproto/Makefile4
-rw-r--r--package/inputproto/Makefile4
-rw-r--r--package/kbproto/Makefile4
-rw-r--r--package/libICE/Makefile4
-rw-r--r--package/libICE/patches/patch-ltmain_sh11
-rw-r--r--package/libSM/Makefile4
-rw-r--r--package/libSM/patches/patch-ltmain_sh11
-rw-r--r--package/libX11/Makefile4
-rw-r--r--package/libX11/patches/patch-ltmain_sh6
-rw-r--r--package/libX11/patches/patch-src_util_Makefile_in40
-rw-r--r--package/libXau/Makefile4
-rw-r--r--package/libXau/patches/patch-ltmain_sh11
-rw-r--r--package/libXaw/Makefile4
-rw-r--r--package/libXaw/patches/patch-ltmain_sh11
-rw-r--r--package/libXcursor/Makefile6
-rw-r--r--package/libXcursor/patches/patch-ltmain_sh11
-rw-r--r--package/libXdmcp/Makefile4
-rw-r--r--package/libXdmcp/patches/patch-ltmain_sh11
-rw-r--r--package/libXext/Makefile4
-rw-r--r--package/libXext/patches/patch-ltmain_sh11
-rw-r--r--package/libXfixes/Makefile4
-rw-r--r--package/libXfont/Makefile4
-rw-r--r--package/libXfont/patches/patch-ltmain_sh11
-rw-r--r--package/libXft/Makefile4
-rw-r--r--package/libXft/patches/autotool.patch63433
-rw-r--r--package/libXi/Makefile4
-rw-r--r--package/libXi/patches/patch-ltmain_sh11
-rw-r--r--package/libXinerama/Makefile4
-rw-r--r--package/libXmu/Makefile4
-rw-r--r--package/libXmu/patches/patch-ltmain_sh11
-rw-r--r--package/libXpm/Makefile6
-rw-r--r--package/libXpm/patches/patch-ltmain_sh11
-rw-r--r--package/libXrandr/Makefile37
-rw-r--r--package/libXrender/Makefile4
-rw-r--r--package/libXt/Makefile4
-rw-r--r--package/libXt/patches/patch-ltmain_sh11
-rw-r--r--package/libXt/patches/patch-util_Makefile_in12
-rw-r--r--package/libXtst/Makefile4
-rw-r--r--package/libXv/Makefile4
-rw-r--r--package/libXv/patches/patch-ltmain_sh11
-rw-r--r--package/libXxf86dga/Makefile4
-rw-r--r--package/libXxf86vm/Makefile4
-rw-r--r--package/libdrm/Makefile4
-rw-r--r--package/libfontenc/Makefile4
-rw-r--r--package/libfontenc/patches/patch-ltmain_sh11
-rw-r--r--package/libpciaccess/Makefile4
-rw-r--r--package/libpciaccess/patches/patch-ltmain_sh11
-rw-r--r--package/libxkbfile/Makefile4
-rw-r--r--package/libxkbfile/patches/autotool.patch61366
-rw-r--r--package/mkfontdir/Makefile6
-rw-r--r--package/mkfontscale/Makefile6
-rw-r--r--package/randrproto/Makefile4
-rw-r--r--package/recordproto/Makefile4
-rw-r--r--package/resourceproto/Makefile4
-rw-r--r--package/scrnsaverproto/Makefile4
-rw-r--r--package/setxkbmap/Makefile6
-rw-r--r--package/util-linux/Makefile1
-rw-r--r--package/xauth/Makefile4
-rw-r--r--package/xbitmaps/Makefile17
-rw-r--r--package/xbitmaps/patches/patch-Makefile_in11
-rw-r--r--package/xextproto/Makefile4
-rw-r--r--package/xf86-input-evdev/Makefile2
-rw-r--r--package/xf86-input-keyboard/Makefile4
-rw-r--r--package/xf86-input-keyboard/patches/patch-ltmain_sh11
-rw-r--r--package/xf86-input-mouse/Makefile4
-rw-r--r--package/xf86-input-mouse/patches/patch-ltmain_sh11
-rw-r--r--package/xf86-video-ati/Makefile2
-rw-r--r--package/xf86-video-cirrus/Makefile2
-rw-r--r--package/xf86-video-geode/Makefile2
-rw-r--r--package/xf86-video-intel/Makefile2
-rw-r--r--package/xf86-video-siliconmotion/Makefile4
-rw-r--r--package/xf86-video-siliconmotion/patches/patch-ltmain_sh11
-rw-r--r--package/xf86vidmodeproto/Makefile4
-rw-r--r--package/xineramaproto/Makefile6
-rw-r--r--package/xinput/Makefile8
-rw-r--r--package/xkeyboard-config/Makefile8
-rw-r--r--package/xorg-server/Makefile4
-rw-r--r--package/xorg-server/patches/patch-fb_fb_h6
-rw-r--r--package/xorg-server/patches/patch-hw_xfree86_common_compiler_h51
-rw-r--r--package/xorg-server/patches/patch-hw_xfree86_dri_sarea_h8
-rw-r--r--package/xorg-server/patches/patch-hw_xfree86_os-support_linux_lnx_init_c6
-rw-r--r--package/xorg-server/patches/patch-hw_xfree86_os-support_linux_lnx_video_c67
-rw-r--r--package/xorg-server/patches/patch-ltmain_sh6
-rw-r--r--package/xproto/Makefile4
-rw-r--r--package/xset/Makefile4
-rw-r--r--package/xsetroot/Makefile2
-rw-r--r--target/linux/patches/3.4.42/bsd-compatibility.patch (renamed from target/linux/patches/3.4.41/bsd-compatibility.patch)0
-rw-r--r--target/linux/patches/3.4.42/cris-etrax.patch (renamed from target/linux/patches/3.4.41/cris-etrax.patch)0
-rw-r--r--target/linux/patches/3.4.42/defaults.patch (renamed from target/linux/patches/3.4.41/defaults.patch)0
-rw-r--r--target/linux/patches/3.4.42/gemalto.patch (renamed from target/linux/patches/3.4.41/gemalto.patch)0
-rw-r--r--target/linux/patches/3.4.42/lemote-rfkill.patch (renamed from target/linux/patches/3.4.41/lemote-rfkill.patch)0
-rw-r--r--target/linux/patches/3.4.42/mmc-host.patch (renamed from target/linux/patches/3.4.41/mmc-host.patch)0
-rw-r--r--target/linux/patches/3.4.42/module-alloc-size-check.patch (renamed from target/linux/patches/3.4.41/module-alloc-size-check.patch)0
-rw-r--r--target/linux/patches/3.4.42/non-static.patch (renamed from target/linux/patches/3.4.41/non-static.patch)0
-rw-r--r--target/linux/patches/3.4.42/sparc-include.patch (renamed from target/linux/patches/3.4.41/sparc-include.patch)0
-rw-r--r--target/linux/patches/3.4.42/startup.patch (renamed from target/linux/patches/3.4.41/startup.patch)0
-rw-r--r--target/linux/patches/3.4.42/usb-defaults-off.patch (renamed from target/linux/patches/3.4.41/usb-defaults-off.patch)0
-rw-r--r--target/linux/patches/3.4.42/uuid.patch (renamed from target/linux/patches/3.4.41/uuid.patch)0
-rw-r--r--target/linux/patches/3.4.42/vga-cons-default-off.patch (renamed from target/linux/patches/3.4.41/vga-cons-default-off.patch)0
-rw-r--r--target/linux/patches/3.4.42/wlan-cf.patch (renamed from target/linux/patches/3.4.41/wlan-cf.patch)0
-rw-r--r--target/linux/patches/3.4.42/zlib-inflate.patch (renamed from target/linux/patches/3.4.41/zlib-inflate.patch)0
-rw-r--r--target/packages/pkg-available/development1
-rw-r--r--toolchain/kernel-headers/patches/3.4.42/aufs2.patch (renamed from toolchain/kernel-headers/patches/3.4.41/aufs2.patch)0
-rw-r--r--toolchain/kernel-headers/patches/3.4.42/cleankernel.patch (renamed from toolchain/kernel-headers/patches/3.4.41/cleankernel.patch)0
-rw-r--r--toolchain/kernel-headers/patches/3.4.42/etrax-header.patch (renamed from toolchain/kernel-headers/patches/3.4.41/etrax-header.patch)0
-rw-r--r--toolchain/kernel-headers/patches/3.4.42/linux-gcc-check.patch (renamed from toolchain/kernel-headers/patches/3.4.41/linux-gcc-check.patch)0
-rw-r--r--toolchain/kernel-headers/patches/3.4.42/microperl.patch (renamed from toolchain/kernel-headers/patches/3.4.41/microperl.patch)0
-rw-r--r--toolchain/kernel-headers/patches/3.4.42/mkpiggy.patch (renamed from toolchain/kernel-headers/patches/3.4.41/mkpiggy.patch)0
-rw-r--r--toolchain/kernel-headers/patches/3.4.42/relocs.patch (renamed from toolchain/kernel-headers/patches/3.4.41/relocs.patch)0
142 files changed, 361 insertions, 140171 deletions
diff --git a/Config.in b/Config.in
index e2aa482..6670f89 100644
--- a/Config.in
+++ b/Config.in
@@ -110,8 +110,8 @@ config ADK_KERNEL_VERSION_3_8_10
prompt "3.8.10"
boolean
-config ADK_KERNEL_VERSION_3_4_41
- prompt "3.4.41"
+config ADK_KERNEL_VERSION_3_4_42
+ prompt "3.4.42"
boolean
endchoice
@@ -119,7 +119,7 @@ endchoice
config ADK_KERNEL_VERSION
string
default "3.8.10" if ADK_KERNEL_VERSION_3_8_10
- default "3.4.41" if ADK_KERNEL_VERSION_3_4_41
+ default "3.4.42" if ADK_KERNEL_VERSION_3_4_42
help
choice
diff --git a/Makefile b/Makefile
index 590c0da..3907452 100644
--- a/Makefile
+++ b/Makefile
@@ -235,3 +235,4 @@ checkreloc:
@bash scripts/reloc.sh
.PHONY: prereq prereq-noerror checkreloc
+# DO NOT DELETE
diff --git a/mk/kernel-ver.mk b/mk/kernel-ver.mk
index 7764296..a7932a7 100644
--- a/mk/kernel-ver.mk
+++ b/mk/kernel-ver.mk
@@ -10,9 +10,9 @@ KERNEL_MOD_VERSION:= $(KERNEL_VERSION)
KERNEL_RELEASE:= 1
KERNEL_MD5SUM:= 3d5fb6d9add9cce7725bbe9b139c8d6e
endif
-ifeq ($(ADK_KERNEL_VERSION_3_4_41),y)
-KERNEL_VERSION:= 3.4.41
+ifeq ($(ADK_KERNEL_VERSION_3_4_42),y)
+KERNEL_VERSION:= 3.4.42
KERNEL_MOD_VERSION:= $(KERNEL_VERSION)
KERNEL_RELEASE:= 1
-KERNEL_MD5SUM:= 3078c420a7adf1393deca76d07de548d
+KERNEL_MD5SUM:= 1d802f8c5b881186d74e087aced2d553
endif
diff --git a/mk/mirrors.mk b/mk/mirrors.mk
index 23bfe21..43bc1a6 100644
--- a/mk/mirrors.mk
+++ b/mk/mirrors.mk
@@ -15,9 +15,9 @@ MASTER_SITE_KERNEL?= \
http://www.kernel.org/pub/linux/ \
MASTER_SITE_XORG?= \
- http://www.x.org/releases/X11R7.6/src/everything/ \
- http://ftp.gwdg.de/pub/x11/x.org/pub/X11R7.6/src/everything/ \
- http://xorg.freedesktop.org/releases/X11R7.6/src/everything/ \
+ http://www.x.org/releases/X11R7.7/src/everything/ \
+ http://ftp.gwdg.de/pub/x11/x.org/pub/X11R7.7/src/everything/ \
+ http://xorg.freedesktop.org/releases/X11R7.7/src/everything/ \
http://xorg.freedesktop.org/releases/individual/app/ \
http://xorg.freedesktop.org/releases/individual/lib/ \
http://xorg.freedesktop.org/releases/individual/driver/ \
diff --git a/package/MesaLib/Makefile b/package/MesaLib/Makefile
index 3dd7ee4..c55aa1d 100644
--- a/package/MesaLib/Makefile
+++ b/package/MesaLib/Makefile
@@ -4,25 +4,21 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= MesaLib
-PKG_VERSION:= 7.8.2
-PKG_RELEASE:= 3
-PKG_MD5SUM:= c89b63d253605ed40e8ac370d25a833c
+PKG_VERSION:= 8.0.5
+PKG_RELEASE:= 1
+PKG_MD5SUM:= cda5d101f43b8784fa60bdeaca4056f2
PKG_DESCR:= MESA library
PKG_SECTION:= libs
PKG_DEPENDS:= libxdamage libxfixes libdrm libxxf86vm libexpat
PKG_BUILDDEP:= libXdamage libXfixes libXxf86vm libdrm
PKG_BUILDDEP+= dri2proto glproto expat libXext
PKG_URL:= http://www.mesa3d.org/
-PKG_SITES:= ftp://ftp.freedesktop.org/pub/mesa/7.8.2/
+PKG_SITES:= ftp://ftp.freedesktop.org/pub/mesa/${PKG_VERSION}/
PKG_NEED_CXX:= 1
-PKG_SUBPKGS:= MESALIB MESALIB_DEV GLXINFO GLXGEARS
+PKG_SUBPKGS:= MESALIB MESALIB_DEV
PKGSD_MESALIB_DEV:= MESA headers
PKGSC_MESALIB_DEV:= devel
-PKGSD_GLXINFO:= Display various GLX information
-PKGSC_GLXINFO:= x11/apps
-PKGSD_GLXGEARS:= Nice little OpenGL demo application
-PKGSC_GLXGEARS:= x11/apps
PKG_ARCH_DEPENDS:= x86 x86_64 mips mipsel mips64 mips64el
@@ -32,21 +28,22 @@ include $(TOPDIR)/mk/package.mk
$(eval $(call PKG_template,MESALIB,mesalib,$(PKG_VERSION)-${PKG_RELEASE},${PKG_DEPENDS},${PKG_DESCR},${PKG_SECTION}))
$(eval $(call PKG_template,MESALIB_DEV,mesalib-dev,$(PKG_VERSION)-${PKG_RELEASE},${PKG_DEPENDS},${PKGSD_MESALIB_DEV},${PKGSC_MESALIB_DEV}))
-$(eval $(call PKG_template,GLXINFO,glxinfo,$(PKG_VERSION)-${PKG_RELEASE},${PKG_DEPENDS},${PKGSD_GLXINFO},${PKGSC_GLXINFO}))
-$(eval $(call PKG_template,GLXGEARS,glxgears,$(PKG_VERSION)-${PKG_RELEASE},${PKG_DEPENDS},${PKGSD_GLXGEARS},${PKGSC_GLXGEARS}))
TARGET_CFLAGS:= $(filter-out -flto,$(TARGET_CFLAGS))
+XAKE_FLAGS+= GCC_HONOUR_COPTS=s
ifeq (${ADK_TARGET_SYSTEM_IBM_X40},y)
DRI_DRIVERS:=i915
endif
CONFIGURE_ARGS+= --disable-static \
- --disable-gallium \
- --disable-glw \
+ --disable-gallium-llvm \
+ --with-gallium-drivers=swrast \
--with-driver=dri \
- --with-dri-drivers=${DRI_DRIVERS},swrast \
- --with-demos=xdemos
+ --disable-gles1 \
+ --disable-gles2 \
+ --with-dri-drivers=${DRI_DRIVERS},swrast
+CONFIGURE_ENV+= PYTHON2=/usr/bin/python
XAKE_FLAGS+= HOST_CC=${CC_FOR_BUILD} GLSL_CL=${STAGING_HOST_DIR}/bin/glslcompile
ifeq ($(ADK_NATIVE),y)
@@ -57,14 +54,15 @@ post-extract:
(cd ${WRKBUILD}; rm -rf config.{cache,status}; \
./configure \
--disable-static \
- --disable-glw \
- --disable-gallium \
+ --disable-gallium-llvm \
+ --with-gallium-drivers=swrast \
--with-driver=xlib \
);
${MAKE} -C ${WRKBUILD}/src/glsl
- ${MAKE} -C ${WRKBUILD}/src/glsl/apps
- ${CP} ${WRKBUILD}/src/glsl/apps/compile \
- ${STAGING_HOST_DIR}/bin/glslcompile
+ ${CP} ${WRKBUILD}/src/glsl/glsl_compiler \
+ ${STAGING_HOST_DIR}/bin/glsl_compiler
+ ${CP} ${WRKBUILD}/src/glsl/builtin_compiler \
+ ${STAGING_HOST_DIR}/bin/builtin_compiler
${MAKE} -C ${WRKBUILD}/src/glsl clean
mesalib-install:
@@ -78,16 +76,6 @@ ifeq (${ADK_TARGET_SYSTEM_IBM_X40},y)
${IDIR_MESALIB}/usr/lib/dri/
endif
-glxinfo-install:
- ${INSTALL_DIR} ${IDIR_GLXINFO}/usr/bin
- ${INSTALL_BIN} ${WRKBUILD}/progs/xdemos/glxinfo \
- ${IDIR_GLXINFO}/usr/bin/
-
-glxgears-install:
- ${INSTALL_DIR} ${IDIR_GLXGEARS}/usr/bin
- ${INSTALL_BIN} ${WRKBUILD}/progs/xdemos/glxgears \
- ${IDIR_GLXGEARS}/usr/bin/
-
mesalib-dev-install:
$(INSTALL_DIR) $(IDIR_MESALIB_DEV)/usr/include
${CP} ${WRKINST}/usr/include/* \
diff --git a/package/MesaLib/patches/000-mesalib-xdemos.patch b/package/MesaLib/patches/000-mesalib-xdemos.patch
deleted file mode 100644
index 0ebf160..0000000
--- a/package/MesaLib/patches/000-mesalib-xdemos.patch
+++ /dev/null
@@ -1,14774 +0,0 @@
-diff -Naurp Mesa-7.8.1/progs/xdemos/corender.c Mesa-7.8.1.patched/progs/xdemos/corender.c
---- Mesa-7.8.1/progs/xdemos/corender.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/corender.c 2010-06-13 13:45:06.789793146 +0200
-@@ -0,0 +1,400 @@
-+/**
-+ * Example of cooperative rendering into one window by two processes.
-+ * The first instance of the program creates the GLX window.
-+ * The second instance of the program gets the window ID from the first
-+ * and draws into it.
-+ * Socket IPC is used for synchronization.
-+ *
-+ * Usage:
-+ * 1. run 'corender &'
-+ * 2. run 'corender 2' (any arg will do)
-+ *
-+ * Brian Paul
-+ * 11 Oct 2007
-+ */
-+
-+
-+#include <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 -Naurp Mesa-7.8.1/progs/xdemos/glsync.c Mesa-7.8.1.patched/progs/xdemos/glsync.c
---- Mesa-7.8.1/progs/xdemos/glsync.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/glsync.c 2010-06-13 13:45:06.789793146 +0200
-@@ -0,0 +1,295 @@
-+/*
-+ * Copyright © 2007 Intel Corporation
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a
-+ * copy of this software and associated documentation files (the "Software"),
-+ * to deal in the Software without restriction, including without limitation
-+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
-+ * and/or sell copies of the Software, and to permit persons to whom the
-+ * Software is furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice (including the next
-+ * paragraph) shall be included in all copies or substantial portions of the
-+ * Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ *
-+ * Authors:
-+ * Jesse Barnes <jesse.barnes@intel.com>
-+ *
-+ */
-+
-+/** @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 -Naurp Mesa-7.8.1/progs/xdemos/glthreads.c Mesa-7.8.1.patched/progs/xdemos/glthreads.c
---- Mesa-7.8.1/progs/xdemos/glthreads.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/glthreads.c 2010-06-13 13:45:06.789793146 +0200
-@@ -0,0 +1,716 @@
-+/*
-+ * Copyright (C) 2000 Brian Paul All Rights Reserved.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a
-+ * copy of this software and associated documentation files (the "Software"),
-+ * to deal in the Software without restriction, including without limitation
-+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
-+ * and/or sell copies of the Software, and to permit persons to whom the
-+ * Software is furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included
-+ * in all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-+ */
-+
-+
-+/*
-+ * This program tests GLX thread safety.
-+ * Command line options:
-+ * -p Open a display connection for each thread
-+ * -l Enable application-side locking
-+ * -n <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 -Naurp Mesa-7.8.1/progs/xdemos/glxcontexts.c Mesa-7.8.1.patched/progs/xdemos/glxcontexts.c
---- Mesa-7.8.1/progs/xdemos/glxcontexts.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/glxcontexts.c 2010-06-13 13:45:06.789793146 +0200
-@@ -0,0 +1,548 @@
-+/*
-+ * Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a
-+ * copy of this software and associated documentation files (the "Software"),
-+ * to deal in the Software without restriction, including without limitation
-+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
-+ * and/or sell copies of the Software, and to permit persons to whom the
-+ * Software is furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included
-+ * in all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-+ */
-+
-+/*
-+ * Version of glxgears that creates/destroys the rendering context for each
-+ * frame. Also periodically destroy/recreate the window.
-+ * Good for finding memory leaks, etc.
-+ *
-+ * Command line options:
-+ * -info print GL implementation information
-+ *
-+ */
-+
-+
-+#include <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 -Naurp Mesa-7.8.1/progs/xdemos/glxdemo.c Mesa-7.8.1.patched/progs/xdemos/glxdemo.c
---- Mesa-7.8.1/progs/xdemos/glxdemo.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/glxdemo.c 2010-06-13 13:45:06.789793146 +0200
-@@ -0,0 +1,127 @@
-+
-+
-+/*
-+ * A demonstration of using the GLX functions. This program is in the
-+ * public domain.
-+ *
-+ * Brian Paul
-+ */
-+
-+#include <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 -Naurp Mesa-7.8.1/progs/xdemos/glxgears.c Mesa-7.8.1.patched/progs/xdemos/glxgears.c
---- Mesa-7.8.1/progs/xdemos/glxgears.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/glxgears.c 2010-06-13 13:45:06.789793146 +0200
-@@ -0,0 +1,787 @@
-+/*
-+ * Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a
-+ * copy of this software and associated documentation files (the "Software"),
-+ * to deal in the Software without restriction, including without limitation
-+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
-+ * and/or sell copies of the Software, and to permit persons to whom the
-+ * Software is furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included
-+ * in all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
-+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
-+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-+ */
-+
-+/*
-+ * This is a port of the infamous "gears" demo to straight GLX (i.e. no GLUT)
-+ * Port by Brian Paul 23 March 2001
-+ *
-+ * See usage() below for command line options.
-+ */
-+
-+
-+#include <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 -Naurp Mesa-7.8.1/progs/xdemos/glxgears_fbconfig.c Mesa-7.8.1.patched/progs/xdemos/glxgears_fbconfig.c
---- Mesa-7.8.1/progs/xdemos/glxgears_fbconfig.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/glxgears_fbconfig.c 2010-06-13 13:45:06.788792936 +0200
-@@ -0,0 +1,632 @@
-+/*
-+ * 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 <idr@us.ibm.com>
-+ */
-+
-+
-+#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 -Naurp Mesa-7.8.1/progs/xdemos/glxgears_pixmap.c Mesa-7.8.1.patched/progs/xdemos/glxgears_pixmap.c
---- Mesa-7.8.1/progs/xdemos/glxgears_pixmap.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/glxgears_pixmap.c 2010-06-13 13:45:06.789793146 +0200
-@@ -0,0 +1,547 @@
-+/*
-+ * 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 <idr@us.ibm.com>
-+ * \author Kristian Hoegsberg <krh@redhat.com>
-+ */
-+
-+
-+#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 -Naurp Mesa-7.8.1/progs/xdemos/glxheads.c Mesa-7.8.1.patched/progs/xdemos/glxheads.c
---- Mesa-7.8.1/progs/xdemos/glxheads.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/glxheads.c 2010-06-13 13:45:06.789793146 +0200
-@@ -0,0 +1,313 @@
-+
-+/*
-+ * 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 -Naurp Mesa-7.8.1/progs/xdemos/glxinfo.c Mesa-7.8.1.patched/progs/xdemos/glxinfo.c
---- Mesa-7.8.1/progs/xdemos/glxinfo.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/glxinfo.c 2010-06-13 13:45:06.788792936 +0200
-@@ -0,0 +1,1195 @@
-+/*
-+ * 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 <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 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;
-+};
-+
-+
-+/*
-+ * 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_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 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_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
-+
-+ 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)
-+{
-+ int visual_type;
-+
-+ memset(attribs, 0, sizeof(struct visual_attribs));
-+
-+ glXGetFBConfigAttrib(dpy, fbconfig, GLX_FBCONFIG_ID, &attribs->id);
-+
-+#if 0
-+ 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;
-+#endif
-+
-+ glXGetFBConfigAttrib(dpy, fbconfig, GLX_X_VISUAL_TYPE, &visual_type);
-+ attribs->klass = glx_token_to_visual_class(visual_type);
-+
-+ 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);
-+
-+ return GL_TRUE;
-+}
-+
-+#endif
-+
-+
-+
-+static void
-+print_visual_attribs_verbose(const struct visual_attribs *attribs)
-+{
-+ printf("Visual ID: %x depth=%d class=%s\n",
-+ attribs->id, attribs->depth, visual_class_name(attribs->klass));
-+ 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\n",
-+ attribs->redSize, attribs->greenSize,
-+ attribs->blueSize, attribs->alphaSize);
-+ 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 ax dp st accumbuffer ms cav\n");
-+ printf(" id dep cl sp sz l ci b ro r g b a bf th cl r g b a ns b eat\n");
-+ printf("----------------------------------------------------------------------\n");
-+}
-+
-+
-+static void
-+print_visual_attribs_short(const struct visual_attribs *attribs)
-+{
-+ char *caveat = NULL;
-+#ifdef GLX_EXT_visual_rating
-+ if (attribs->visualCaveat == GLX_NONE_EXT || attribs->visualCaveat == 0)
-+ caveat = "None";
-+ else if (attribs->visualCaveat == GLX_SLOW_VISUAL_EXT)
-+ caveat = "Slow";
-+ else if (attribs->visualCaveat == GLX_NON_CONFORMANT_VISUAL_EXT)
-+ caveat = "Ncon";
-+ else
-+ caveat = "None";
-+#else
-+ caveat = "None";
-+#endif
-+
-+ printf("0x%02x %2d %2s %2d %2d %2d %c%c %c %c %2d %2d %2d %2d %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->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 aux dep ste accum buffers MS MS\n");
-+ printf(" ID Depth Type parent size el type reo sz sz sz sz buf th ncl r g b a num bufs\n");
-+ printf("----------------------------------------------------------------------------------------------------\n");
-+}
-+
-+
-+static void
-+print_visual_attribs_long(const struct visual_attribs *attribs)
-+{
-+ printf("0x%2x %2d %-11s %2d %2d %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(" %3d %4d %2d %3d %3d %3d %3d %2d %2d\n",
-+ attribs->auxBuffers,
-+ attribs->depthSize,
-+ attribs->stencilSize,
-+ attribs->accumRedSize, attribs->accumGreenSize,
-+ attribs->accumBlueSize, attribs->accumAlphaSize,
-+ attribs->numSamples, attribs->numMultisample
-+ );
-+}
-+
-+
-+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 -Naurp Mesa-7.8.1/progs/xdemos/glxpbdemo.c Mesa-7.8.1.patched/progs/xdemos/glxpbdemo.c
---- Mesa-7.8.1/progs/xdemos/glxpbdemo.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/glxpbdemo.c 2010-06-13 13:45:06.789793146 +0200
-@@ -0,0 +1,431 @@
-+
-+/*
-+ * 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. <bsder@allcaps.org>
-+ *
-+ * 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 -Naurp Mesa-7.8.1/progs/xdemos/glxpixmap.c Mesa-7.8.1.patched/progs/xdemos/glxpixmap.c
---- Mesa-7.8.1/progs/xdemos/glxpixmap.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/glxpixmap.c 2010-06-13 13:45:06.788792936 +0200
-@@ -0,0 +1,187 @@
-+
-+
-+/*
-+ * 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 -Naurp Mesa-7.8.1/progs/xdemos/glxsnoop.c Mesa-7.8.1.patched/progs/xdemos/glxsnoop.c
---- Mesa-7.8.1/progs/xdemos/glxsnoop.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/glxsnoop.c 2010-06-13 13:45:06.788792936 +0200
-@@ -0,0 +1,377 @@
-+/**
-+ * 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 -Naurp Mesa-7.8.1/progs/xdemos/glxswapcontrol.c Mesa-7.8.1.patched/progs/xdemos/glxswapcontrol.c
---- Mesa-7.8.1/progs/xdemos/glxswapcontrol.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/glxswapcontrol.c 2010-06-13 13:45:06.788792936 +0200
-@@ -0,0 +1,893 @@
-+/*
-+ * 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 <idr@us.ibm.com> 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 -Naurp Mesa-7.8.1/progs/xdemos/ipc.c Mesa-7.8.1.patched/progs/xdemos/ipc.c
---- Mesa-7.8.1/progs/xdemos/ipc.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/ipc.c 2010-06-13 13:45:06.789793146 +0200
-@@ -0,0 +1,264 @@
-+/* 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 -Naurp Mesa-7.8.1/progs/xdemos/ipc.h Mesa-7.8.1.patched/progs/xdemos/ipc.h
---- Mesa-7.8.1/progs/xdemos/ipc.h 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/ipc.h 2010-06-13 13:45:06.789793146 +0200
-@@ -0,0 +1,16 @@
-+#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 -Naurp Mesa-7.8.1/progs/xdemos/Makefile Mesa-7.8.1.patched/progs/xdemos/Makefile
---- Mesa-7.8.1/progs/xdemos/Makefile 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/Makefile 2010-06-13 13:45:06.788792936 +0200
-@@ -0,0 +1,103 @@
-+# 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 += -lX11 -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 -Naurp Mesa-7.8.1/progs/xdemos/manywin.c Mesa-7.8.1.patched/progs/xdemos/manywin.c
---- Mesa-7.8.1/progs/xdemos/manywin.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/manywin.c 2010-06-13 13:45:06.789793146 +0200
-@@ -0,0 +1,421 @@
-+/*
-+ * 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 -Naurp Mesa-7.8.1/progs/xdemos/msctest.c Mesa-7.8.1.patched/progs/xdemos/msctest.c
---- Mesa-7.8.1/progs/xdemos/msctest.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/msctest.c 2010-06-13 13:45:06.789793146 +0200
-@@ -0,0 +1,195 @@
-+/*
-+ * 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 <jesse.barnes@intel.com>
-+ *
-+ */
-+
-+/** @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 -Naurp Mesa-7.8.1/progs/xdemos/multictx.c Mesa-7.8.1.patched/progs/xdemos/multictx.c
---- Mesa-7.8.1/progs/xdemos/multictx.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/multictx.c 2010-06-13 13:45:06.789793146 +0200
-@@ -0,0 +1,585 @@
-+/*
-+ * 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 -Naurp Mesa-7.8.1/progs/xdemos/offset.c Mesa-7.8.1.patched/progs/xdemos/offset.c
---- Mesa-7.8.1/progs/xdemos/offset.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/offset.c 2010-06-13 13:45:06.789793146 +0200
-@@ -0,0 +1,343 @@
-+/****************************************************************************
-+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 -Naurp Mesa-7.8.1/progs/xdemos/omlsync.c Mesa-7.8.1.patched/progs/xdemos/omlsync.c
---- Mesa-7.8.1/progs/xdemos/omlsync.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/omlsync.c 2010-06-13 13:45:06.788792936 +0200
-@@ -0,0 +1,265 @@
-+/*
-+ * 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 <jesse.barnes@intel.com>
-+ *
-+ */
-+
-+/** @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);
-+
-+ glXSwapBuffersMscOML(disp, winGL, 0, divisor, remainder);
-+
-+ if (wait_interval) {
-+ glXWaitForMscOML(disp, winGL, msc + wait_interval,
-+ 0, 0, &ust, &msc, &sbc);
-+ }
-+ }
-+
-+ XDestroyWindow(disp, winGL);
-+ glXDestroyContext(disp, context);
-+ XCloseDisplay(disp);
-+
-+ return 0;
-+}
-diff -Naurp Mesa-7.8.1/progs/xdemos/opencloseopen.c Mesa-7.8.1.patched/progs/xdemos/opencloseopen.c
---- Mesa-7.8.1/progs/xdemos/opencloseopen.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/opencloseopen.c 2010-06-13 13:45:06.788792936 +0200
-@@ -0,0 +1,189 @@
-+/*
-+ * 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 -Naurp Mesa-7.8.1/progs/xdemos/overlay.c Mesa-7.8.1.patched/progs/xdemos/overlay.c
---- Mesa-7.8.1/progs/xdemos/overlay.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/overlay.c 2010-06-13 13:45:06.789793146 +0200
-@@ -0,0 +1,246 @@
-+/*
-+ * 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 -Naurp Mesa-7.8.1/progs/xdemos/pbdemo.c Mesa-7.8.1.patched/progs/xdemos/pbdemo.c
---- Mesa-7.8.1/progs/xdemos/pbdemo.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/pbdemo.c 2010-06-13 13:45:06.789793146 +0200
-@@ -0,0 +1,493 @@
-+
-+/*
-+ * 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 -Naurp Mesa-7.8.1/progs/xdemos/pbinfo.c Mesa-7.8.1.patched/progs/xdemos/pbinfo.c
---- Mesa-7.8.1/progs/xdemos/pbinfo.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/pbinfo.c 2010-06-13 13:45:06.789793146 +0200
-@@ -0,0 +1,107 @@
-+
-+/*
-+ * 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 -Naurp Mesa-7.8.1/progs/xdemos/pbutil.c Mesa-7.8.1.patched/progs/xdemos/pbutil.c
---- Mesa-7.8.1/progs/xdemos/pbutil.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/pbutil.c 2010-06-13 13:45:06.789793146 +0200
-@@ -0,0 +1,446 @@
-+
-+/*
-+ * 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 -Naurp Mesa-7.8.1/progs/xdemos/pbutil.h Mesa-7.8.1.patched/progs/xdemos/pbutil.h
---- Mesa-7.8.1/progs/xdemos/pbutil.h 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/pbutil.h 2010-06-13 13:45:06.789793146 +0200
-@@ -0,0 +1,69 @@
-+/*
-+ * 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 -Naurp Mesa-7.8.1/progs/xdemos/shape.c Mesa-7.8.1.patched/progs/xdemos/shape.c
---- Mesa-7.8.1/progs/xdemos/shape.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/shape.c 2010-06-13 13:45:06.789793146 +0200
-@@ -0,0 +1,393 @@
-+
-+/*
-+ * 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 -Naurp Mesa-7.8.1/progs/xdemos/sharedtex.c Mesa-7.8.1.patched/progs/xdemos/sharedtex.c
---- Mesa-7.8.1/progs/xdemos/sharedtex.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/sharedtex.c 2010-06-13 13:45:06.789793146 +0200
-@@ -0,0 +1,324 @@
-+/*
-+ * 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 -Naurp Mesa-7.8.1/progs/xdemos/sharedtex_mt.c Mesa-7.8.1.patched/progs/xdemos/sharedtex_mt.c
---- Mesa-7.8.1/progs/xdemos/sharedtex_mt.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/sharedtex_mt.c 2010-06-13 13:45:06.788792936 +0200
-@@ -0,0 +1,490 @@
-+/* $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 -Naurp Mesa-7.8.1/progs/xdemos/texture_from_pixmap.c Mesa-7.8.1.patched/progs/xdemos/texture_from_pixmap.c
---- Mesa-7.8.1/progs/xdemos/texture_from_pixmap.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/texture_from_pixmap.c 2010-06-13 13:45:06.789793146 +0200
-@@ -0,0 +1,396 @@
-+/*
-+ * 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 -Naurp Mesa-7.8.1/progs/xdemos/wincopy.c Mesa-7.8.1.patched/progs/xdemos/wincopy.c
---- Mesa-7.8.1/progs/xdemos/wincopy.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/wincopy.c 2010-06-13 13:45:06.789793146 +0200
-@@ -0,0 +1,328 @@
-+/*
-+ * 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 -Naurp Mesa-7.8.1/progs/xdemos/xdemo.c Mesa-7.8.1.patched/progs/xdemos/xdemo.c
---- Mesa-7.8.1/progs/xdemos/xdemo.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/xdemo.c 2010-06-13 13:45:06.788792936 +0200
-@@ -0,0 +1,334 @@
-+
-+/*
-+ * 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 -Naurp Mesa-7.8.1/progs/xdemos/xfont.c Mesa-7.8.1.patched/progs/xdemos/xfont.c
---- Mesa-7.8.1/progs/xdemos/xfont.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/xfont.c 2010-06-13 13:45:06.788792936 +0200
-@@ -0,0 +1,206 @@
-+
-+/*
-+ * 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 -Naurp Mesa-7.8.1/progs/xdemos/xrotfontdemo.c Mesa-7.8.1.patched/progs/xdemos/xrotfontdemo.c
---- Mesa-7.8.1/progs/xdemos/xrotfontdemo.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/xrotfontdemo.c 2010-06-13 13:45:06.789793146 +0200
-@@ -0,0 +1,220 @@
-+/*
-+ * 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 -Naurp Mesa-7.8.1/progs/xdemos/xuserotfont.c Mesa-7.8.1.patched/progs/xdemos/xuserotfont.c
---- Mesa-7.8.1/progs/xdemos/xuserotfont.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/xuserotfont.c 2010-06-13 13:45:06.789793146 +0200
-@@ -0,0 +1,399 @@
-+/*
-+ * 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 -Naurp Mesa-7.8.1/progs/xdemos/xuserotfont.h Mesa-7.8.1.patched/progs/xdemos/xuserotfont.h
---- Mesa-7.8.1/progs/xdemos/xuserotfont.h 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/xuserotfont.h 2010-06-13 13:45:06.789793146 +0200
-@@ -0,0 +1,12 @@
-+#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 -Naurp Mesa-7.8.1/progs/xdemos/yuvrect_client.c Mesa-7.8.1.patched/progs/xdemos/yuvrect_client.c
---- Mesa-7.8.1/progs/xdemos/yuvrect_client.c 1970-01-01 01:00:00.000000000 +0100
-+++ Mesa-7.8.1.patched/progs/xdemos/yuvrect_client.c 2010-06-13 13:45:06.789793146 +0200
-@@ -0,0 +1,326 @@
-+/*
-+ * 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;
-+}
diff --git a/package/MesaLib/patches/patch-bin_mklib b/package/MesaLib/patches/patch-bin_mklib
index 6882933..2f53c15 100644
--- a/package/MesaLib/patches/patch-bin_mklib
+++ b/package/MesaLib/patches/patch-bin_mklib
@@ -1,28 +1,33 @@
---- Mesa-7.8.2.orig/bin/mklib 2010-06-15 19:43:41.000000000 +0200
-+++ Mesa-7.8.2/bin/mklib 2013-02-12 13:27:53.000000000 +0100
-@@ -333,10 +333,6 @@ case $ARCH in
+diff -Nur Mesa-8.0.5.orig/bin/mklib Mesa-8.0.5/bin/mklib
+--- Mesa-8.0.5.orig/bin/mklib 2012-10-24 21:03:58.000000000 +0200
++++ Mesa-8.0.5/bin/mklib 2013-04-30 13:06:28.000000000 +0200
+@@ -333,12 +333,6 @@
# Check if objects are 32-bit and we're running in 64-bit
# environment. If so, pass -m32 flag to linker.
set ${OBJECTS}
- ABI32=`file $1 | grep 32-bit`
-- if [ "${ABI32}" -a `uname -m` = "x86_64" ] ; then
+- ARM=`file $1 | grep ARM`
+- # Do not add "-m32" option for arm.
+- if [ -z "$ARM" -a "${ABI32}" -a `uname -m` = "x86_64" ] ; then
- OPTS="-m32 ${OPTS}"
- fi
if [ "${ALTOPTS}" ] ; then
OPTS=${ALTOPTS}
-@@ -390,10 +386,6 @@ case $ARCH in
+@@ -392,12 +386,6 @@
# Check if objects are 32-bit and we're running in 64-bit
# environment. If so, pass -m32 flag to linker.
set ${OBJECTS}
- ABI32=`file $1 | grep 32-bit`
-- if [ "${ABI32}" -a `uname -m` = "x86_64" ] ; then
+- ARM=`file $1 | grep ARM`
+- # Do not add "-m32" option for arm.
+- if [ -z "$ARM" -a "${ABI32}" -a `uname -m` = "x86_64" ] ; then
- OPTS="-m32 ${OPTS}"
- fi
if [ "${ALTOPTS}" ] ; then
OPTS=${ALTOPTS}
fi
-@@ -462,12 +454,6 @@ case $ARCH in
+@@ -466,12 +454,6 @@
# Check if objects are 32-bit and we're running in 64-bit
# environment. If so, pass -m32 flag to linker.
set ${OBJECTS}
diff --git a/package/MesaLib/patches/patch-configs_default b/package/MesaLib/patches/patch-configs_default
deleted file mode 100644
index f954d98..0000000
--- a/package/MesaLib/patches/patch-configs_default
+++ /dev/null
@@ -1,11 +0,0 @@
---- Mesa-7.8.2.orig/configs/default 2010-06-16 23:22:17.000000000 +0200
-+++ Mesa-7.8.2/configs/default 2010-12-03 01:19:21.000000000 +0100
-@@ -32,7 +32,7 @@ APP_CXX = $(CXX)
-
- # Misc tools and flags
- SHELL = /bin/sh
--MKLIB = $(SHELL) $(TOP)/bin/mklib
-+MKLIB = env RANLIB=$(RANLIB) AR=$(AR) $(SHELL) $(TOP)/bin/mklib
- MKLIB_OPTIONS =
- MKDEP = makedepend
- MKDEP_OPTIONS = -fdepend
diff --git a/package/MesaLib/patches/patch-include_GL_internal_sarea_h b/package/MesaLib/patches/patch-include_GL_internal_sarea_h
deleted file mode 100644
index 7de6433..0000000
--- a/package/MesaLib/patches/patch-include_GL_internal_sarea_h
+++ /dev/null
@@ -1,12 +0,0 @@
- fix for loongson
---- Mesa-7.8.1.orig/include/GL/internal/sarea.h 2010-02-05 01:10:39.000000000 +0100
-+++ Mesa-7.8.1/include/GL/internal/sarea.h 2010-06-12 19:13:41.417809541 +0200
-@@ -42,6 +42,8 @@
- /* SAREA area needs to be at least a page */
- #if defined(__alpha__)
- #define SAREA_MAX 0x2000
-+#elif defined(__mips__)
-+#define SAREA_MAX 0x4000
- #elif defined(__ia64__)
- #define SAREA_MAX 0x10000 /* 64kB */
- #else
diff --git a/package/MesaLib/patches/patch-src_glsl_Makefile b/package/MesaLib/patches/patch-src_glsl_Makefile
index baa023d..f8f85b7 100644
--- a/package/MesaLib/patches/patch-src_glsl_Makefile
+++ b/package/MesaLib/patches/patch-src_glsl_Makefile
@@ -1,11 +1,10 @@
---- Mesa-7.8.1.orig/src/glsl/Makefile 2010-04-05 01:46:26.000000000 +0200
-+++ Mesa-7.8.1/src/glsl/Makefile 2010-05-21 17:17:54.621613561 +0200
-@@ -4,7 +4,7 @@ TOP = ../..
+--- Mesa-8.0.5.orig/src/glsl/Makefile 2012-10-24 21:03:59.000000000 +0200
++++ Mesa-8.0.5/src/glsl/Makefile 2013-04-30 12:25:40.000000000 +0200
+@@ -167,6 +167,6 @@ builtin_compiler: $(GLSL2_OBJECTS) $(OBJ
- include $(TOP)/configs/current
+ builtin_function.cpp: builtins/profiles/* builtins/ir/* builtins/tools/generate_builtins.py builtins/tools/texture_builtins.py builtin_compiler
+ @echo Regenerating builtin_function.cpp...
+- $(PYTHON2) $(PYTHON_FLAGS) builtins/tools/generate_builtins.py ./builtin_compiler > builtin_function.cpp || rm -f builtin_function.cpp
++ $(PYTHON2) $(PYTHON_FLAGS) builtins/tools/generate_builtins.py builtin_compiler > builtin_function.cpp || rm -f builtin_function.cpp
--SUBDIRS = pp cl apps
-+SUBDIRS = pp cl
-
- default install clean:
- @for dir in $(SUBDIRS) ; do \
+ -include depend
diff --git a/package/MesaLib/patches/patch-src_glsl_apps_Makefile b/package/MesaLib/patches/patch-src_glsl_apps_Makefile
deleted file mode 100644
index 76d23d7..0000000
--- a/package/MesaLib/patches/patch-src_glsl_apps_Makefile
+++ /dev/null
@@ -1,15 +0,0 @@
---- Mesa-7.8.1.orig/src/glsl/apps/Makefile 2010-04-05 01:46:26.000000000 +0200
-+++ Mesa-7.8.1/src/glsl/apps/Makefile 2010-05-25 17:38:03.594714854 +0200
-@@ -26,10 +26,10 @@ INCLUDES = -I.
- .SUFFIXES: .c
-
- .c:
-- $(APP_CC) $(INCLUDES) $(CFLAGS) $(LDFLAGS) $< $(LIBS) -o $@
-+ $(APP_CC) $(HOSTCFLAGS) $< $(LIBS) -o $@
-
- .c.o:
-- $(APP_CC) -c $(INCLUDES) $(CFLAGS) $(DEFINES) $< -o $@
-+ $(APP_CC) -c $(HOSTCFLAGS) $(DEFINES) $< -o $@
-
-
- ##### TARGETS #####
diff --git a/package/MesaLib/patches/patch-src_mesa_Makefile b/package/MesaLib/patches/patch-src_mesa_Makefile
deleted file mode 100644
index 3586931..0000000
--- a/package/MesaLib/patches/patch-src_mesa_Makefile
+++ /dev/null
@@ -1,21 +0,0 @@
---- Mesa-7.8.2.orig/src/mesa/Makefile 2010-06-15 19:43:42.000000000 +0200
-+++ Mesa-7.8.2/src/mesa/Makefile 2010-12-04 22:11:40.000000000 +0100
-@@ -30,15 +30,15 @@ default: depend asm_subdirs glsl_builtin
-
- # Make archive of core mesa object files
- libmesa.a: $(MESA_OBJECTS) $(GLSL_LIBS)
-- @ $(MKLIB) -o mesa -static $(MESA_OBJECTS) $(GLSL_LIBS)
-+ $(MKLIB) -o mesa -static $(MESA_OBJECTS) $(GLSL_LIBS)
-
- # Make archive of subset of core mesa object files for gallium
- libmesagallium.a: $(MESA_GALLIUM_OBJECTS) $(GLSL_LIBS)
-- @ $(MKLIB) -o mesagallium -static $(MESA_GALLIUM_OBJECTS) $(GLSL_LIBS)
-+ $(MKLIB) -o mesagallium -static $(MESA_GALLIUM_OBJECTS) $(GLSL_LIBS)
-
- # Make archive of gl* API dispatcher functions only
- libglapi.a: $(GLAPI_OBJECTS)
-- @ $(MKLIB) -o glapi -static $(GLAPI_OBJECTS)
-+ $(MKLIB) -o glapi -static $(GLAPI_OBJECTS)
-
- ######################################################################
- # Device drivers
diff --git a/package/MesaLib/patches/patch-src_mesa_drivers_dri_savage_savageioctl_c b/package/MesaLib/patches/patch-src_mesa_drivers_dri_savage_savageioctl_c
deleted file mode 100644
index 1d72208..0000000
--- a/package/MesaLib/patches/patch-src_mesa_drivers_dri_savage_savageioctl_c
+++ /dev/null
@@ -1,10 +0,0 @@
---- Mesa-7.8.1.orig/src/mesa/drivers/dri/savage/savageioctl.c 2010-04-05 01:46:26.000000000 +0200
-+++ Mesa-7.8.1/src/mesa/drivers/dri/savage/savageioctl.c 2010-04-19 21:26:28.000000000 +0200
-@@ -41,7 +41,6 @@
- #include "savagespan.h"
-
- #include "drm.h"
--#include <sys/timeb.h>
-
- #define DEPTH_SCALE_16 ((1<<16)-1)
- #define DEPTH_SCALE_24 ((1<<24)-1)
diff --git a/package/MesaLib/patches/patch-src_mesa_main_imports_c b/package/MesaLib/patches/patch-src_mesa_main_imports_c
deleted file mode 100644
index 5dba4dd..0000000
--- a/package/MesaLib/patches/patch-src_mesa_main_imports_c
+++ /dev/null
@@ -1,17 +0,0 @@
---- Mesa-7.8.2.orig/src/mesa/main/imports.c 2010-06-15 19:43:43.000000000 +0200
-+++ Mesa-7.8.2/src/mesa/main/imports.c 2010-12-03 01:16:56.000000000 +0100
-@@ -800,13 +800,7 @@ _mesa_strdup( const char *s )
- float
- _mesa_strtof( const char *s, char **end )
- {
--#ifdef _GNU_SOURCE
-- static locale_t loc = NULL;
-- if (!loc) {
-- loc = newlocale(LC_CTYPE_MASK, "C", NULL);
-- }
-- return strtof_l(s, end, loc);
--#elif defined(_ISOC99_SOURCE) || (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 600)
-+#if defined(_ISOC99_SOURCE) || (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 600)
- return strtof(s, end);
- #else
- return (float)strtod(s, end);
diff --git a/package/MesaLib/patches/patch-src_mesa_shader_slang_library_Makefile b/package/MesaLib/patches/patch-src_mesa_shader_slang_library_Makefile
deleted file mode 100644
index ea769ce..0000000
--- a/package/MesaLib/patches/patch-src_mesa_shader_slang_library_Makefile
+++ /dev/null
@@ -1,11 +0,0 @@
---- Mesa-7.8.2.orig/src/mesa/shader/slang/library/Makefile 2010-04-27 23:41:21.000000000 +0200
-+++ Mesa-7.8.2/src/mesa/shader/slang/library/Makefile 2010-12-04 21:18:11.000000000 +0100
-@@ -4,7 +4,7 @@ TOP = ../../../../..
-
- include $(TOP)/configs/current
-
--GLSL_CL = $(TOP)/src/glsl/apps/compile
-+GLSL_CL ?= $(TOP)/src/glsl/apps/compile
-
- #
- # targets
diff --git a/package/bigreqsproto/Makefile b/package/bigreqsproto/Makefile
index 454ff1b..2861d2e 100644
--- a/package/bigreqsproto/Makefile
+++ b/package/bigreqsproto/Makefile
@@ -4,11 +4,11 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= bigreqsproto
-PKG_VERSION:= 1.1.1
+PKG_VERSION:= 1.1.2
PKG_RELEASE:= 1
PKG_DESCR:= Big Requests Extension headers
PKG_SECTION:= x11/devel
-PKG_MD5SUM:= 3392142c19cb5a22058cae88be3c554a
+PKG_MD5SUM:= 9b83369ac7a5eb2bf54c8f34db043a0e
PKG_SITES:= ${MASTER_SITE_XORG}
include $(TOPDIR)/mk/package.mk
diff --git a/package/compositeproto/Makefile b/package/compositeproto/Makefile
index ee40125..fa31132 100644
--- a/package/compositeproto/Makefile
+++ b/package/compositeproto/Makefile
@@ -4,9 +4,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= compositeproto
-PKG_VERSION:= 0.4.1
+PKG_VERSION:= 0.4.2
PKG_RELEASE:= 1
-PKG_MD5SUM:= 6994a209774fe7877fd8e0c9fafe2466
+PKG_MD5SUM:= 2dea7c339432b3363faf2d29c208e7b5
PKG_DESCR:= X11 composite headers
PKG_SECTION:= x11/devel
PKG_SITES:= ${MASTER_SITE_XORG}
diff --git a/package/damageproto/Makefile b/package/damageproto/Makefile
index aef34a4..4269c2a 100644
--- a/package/damageproto/Makefile
+++ b/package/damageproto/Makefile
@@ -4,9 +4,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= damageproto
-PKG_VERSION:= 1.2.0
+PKG_VERSION:= 1.2.1
PKG_RELEASE:= 1
-PKG_MD5SUM:= 423516fd64e43e8671120056b0d9f597
+PKG_MD5SUM:= bf8c47b7f48625230cff155180f8ddce
PKG_DESCR:= X DAMAGE Extension headers
PKG_SECTION:= x11/devel
PKG_SITES:= ${MASTER_SITE_XORG}
diff --git a/package/dri2proto/Makefile b/package/dri2proto/Makefile
index b9fe827..0083b5a 100644
--- a/package/dri2proto/Makefile
+++ b/package/dri2proto/Makefile
@@ -4,9 +4,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= dri2proto
-PKG_VERSION:= 2.3
+PKG_VERSION:= 2.6
PKG_RELEASE:= 1
-PKG_MD5SUM:= 2087269416782cff56f9b22d1449c192
+PKG_MD5SUM:= 873142af5db695537cfe05e01d13541f
PKG_DESCR:= DRI protocol headers
PKG_SECTION:= x11/devel
PKG_SITES:= ${MASTER_SITE_XORG}
diff --git a/package/fixesproto/Makefile b/package/fixesproto/Makefile
index eff6302..88572de 100644
--- a/package/fixesproto/Makefile
+++ b/package/fixesproto/Makefile
@@ -4,11 +4,11 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= fixesproto
-PKG_VERSION:= 4.1.2
+PKG_VERSION:= 5.0
PKG_RELEASE:= 1
PKG_DESCR:= XFIXES Extension headers
PKG_SECTION:= x11/devel
-PKG_MD5SUM:= 352e7ea8278bc31a8d75b31232a61cd4
+PKG_MD5SUM:= 1b3115574cadd4cbea1f197faa7c1de4
PKG_SITES:= ${MASTER_SITE_XORG}
include $(TOPDIR)/mk/package.mk
diff --git a/package/font-adobe-100dpi/Makefile b/package/font-adobe-100dpi/Makefile
index 35e10ec..e57b4f0 100644
--- a/package/font-adobe-100dpi/Makefile
+++ b/package/font-adobe-100dpi/Makefile
@@ -4,9 +4,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= font-adobe-100dpi
-PKG_VERSION:= 1.0.1
+PKG_VERSION:= 1.0.3
PKG_RELEASE:= 1
-PKG_MD5SUM:= 93bd04e2fb348a0c48e13ab3933f2381
+PKG_MD5SUM:= ba61e7953f4f5cec5a8e69c262bbc7f9
PKG_DESCR:= X fonts
PKG_SECTION:= x11/fonts
PKG_DEPENDS:= font-util
diff --git a/package/font-adobe-75dpi/Makefile b/package/font-adobe-75dpi/Makefile
index 6f0da98..bbdff72 100644
--- a/package/font-adobe-75dpi/Makefile
+++ b/package/font-adobe-75dpi/Makefile
@@ -4,9 +4,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= font-adobe-75dpi
-PKG_VERSION:= 1.0.1
+PKG_VERSION:= 1.0.3
PKG_RELEASE:= 1
-PKG_MD5SUM:= d22283daba10129643800d73f5496aab
+PKG_MD5SUM:= 7a414bb661949cec938938fd678cf649
PKG_DESCR:= X fonts
PKG_SECTION:= x11/fonts
PKG_DEPENDS:= font-util
diff --git a/package/font-bh-100dpi/Makefile b/package/font-bh-100dpi/Makefile
index 94c9288..6aef1e5 100644
--- a/package/font-bh-100dpi/Makefile
+++ b/package/font-bh-100dpi/Makefile
@@ -4,9 +4,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= font-bh-100dpi
-PKG_VERSION:= 1.0.1
+PKG_VERSION:= 1.0.3
PKG_RELEASE:= 1
-PKG_MD5SUM:= d9383b2ddda241a464343b7b4de370a9
+PKG_MD5SUM:= 09e63a5608000531179e1ab068a35878
PKG_DESCR:= X fonts
PKG_SECTION:= x11/fonts
PKG_BUILDDEP:= font-util
diff --git a/package/font-bh-75dpi/Makefile b/package/font-bh-75dpi/Makefile
index 7aaaba5..3845bae 100644
--- a/package/font-bh-75dpi/Makefile
+++ b/package/font-bh-75dpi/Makefile
@@ -4,9 +4,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= font-bh-75dpi
-PKG_VERSION:= 1.0.1
+PKG_VERSION:= 1.0.3
PKG_RELEASE:= 1
-PKG_MD5SUM:= 200b38e879dcbf922ca2a9f71ad44657
+PKG_MD5SUM:= 88fec4ebc4a265684bff3abdd066f14f
PKG_DESCR:= X fonts
PKG_SECTION:= x11/fonts
PKG_BUILDDEP:= font-util
diff --git a/package/font-bh-lucidatypewriter-100dpi/Makefile b/package/font-bh-lucidatypewriter-100dpi/Makefile
index 443eb47..8c6d08e 100644
--- a/package/font-bh-lucidatypewriter-100dpi/Makefile
+++ b/package/font-bh-lucidatypewriter-100dpi/Makefile
@@ -4,9 +4,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= font-bh-lucidatypewriter-100dpi
-PKG_VERSION:= 1.0.1
+PKG_VERSION:= 1.0.3
PKG_RELEASE:= 1
-PKG_MD5SUM:= 8fa38b7845c10ff83d6077a1e238b15b
+PKG_MD5SUM:= 5f716f54e497fb4ec1bb3a5d650ac6f7
PKG_DESCR:= X fonts
PKG_SECTION:= x11/fonts
PKG_BUILDDEP:= font-util
diff --git a/package/font-bh-lucidatypewriter-75dpi/Makefile b/package/font-bh-lucidatypewriter-75dpi/Makefile
index ebe5555..3b7d4b5 100644
--- a/package/font-bh-lucidatypewriter-75dpi/Makefile
+++ b/package/font-bh-lucidatypewriter-75dpi/Makefile
@@ -4,9 +4,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= font-bh-lucidatypewriter-75dpi
-PKG_VERSION:= 1.0.1
+PKG_VERSION:= 1.0.3
PKG_RELEASE:= 1
-PKG_MD5SUM:= f36b68aabef2d57258131ce6136c6f50
+PKG_MD5SUM:= cab8a44ae329aab7141c7adeef0daf5a
PKG_DESCR:= X fonts
PKG_SECTION:= x11/fonts
PKG_BUILDDEP:= font-util
diff --git a/package/font-bh-ttf/Makefile b/package/font-bh-ttf/Makefile
index fd0872f..fd25344 100644
--- a/package/font-bh-ttf/Makefile
+++ b/package/font-bh-ttf/Makefile
@@ -4,9 +4,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= font-bh-ttf
-PKG_VERSION:= 1.0.1
+PKG_VERSION:= 1.0.3
PKG_RELEASE:= 1
-PKG_MD5SUM:= baea1bb10808857e595f13c6be9cbfbe
+PKG_MD5SUM:= 4ce741ec4edaa11cd38988d355a7578b
PKG_DESCR:= X fonts
PKG_SECTION:= x11/fonts
PKG_BUILDDEP:= font-util
diff --git a/package/font-bitstream-100dpi/Makefile b/package/font-bitstream-100dpi/Makefile
index 20c1c79..87d1922 100644
--- a/package/font-bitstream-100dpi/Makefile
+++ b/package/font-bitstream-100dpi/Makefile
@@ -4,9 +4,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= font-bitstream-100dpi
-PKG_VERSION:= 1.0.1
+PKG_VERSION:= 1.0.3
PKG_RELEASE:= 1
-PKG_MD5SUM:= 823c3c2a1a2307bdca5961145e3db37d
+PKG_MD5SUM:= c27bf37e9b8039f93bd90b8131ed37ad
PKG_DESCR:= X fonts
PKG_SECTION:= x11/fonts
PKG_BUILDDEP:= font-util
diff --git a/package/font-bitstream-75dpi/Makefile b/package/font-bitstream-75dpi/Makefile
index 2bb5c8b..7f685c4 100644
--- a/package/font-bitstream-75dpi/Makefile
+++ b/package/font-bitstream-75dpi/Makefile
@@ -4,9 +4,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= font-bitstream-75dpi
-PKG_VERSION:= 1.0.1
+PKG_VERSION:= 1.0.3
PKG_RELEASE:= 1
-PKG_MD5SUM:= f8e982bcaaed199fdac03e9fc12b2952
+PKG_MD5SUM:= 4ff6c5d6aebe69371e27b09ad8313d25
PKG_DESCR:= X fonts
PKG_SECTION:= x11/fonts
PKG_BUILDDEP:= font-util
diff --git a/package/font-bitstream-type1/Makefile b/package/font-bitstream-type1/Makefile
index 654aea3..b623298 100644
--- a/package/font-bitstream-type1/Makefile
+++ b/package/font-bitstream-type1/Makefile
@@ -4,9 +4,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= font-bitstream-type1
-PKG_VERSION:= 1.0.1
+PKG_VERSION:= 1.0.3
PKG_RELEASE:= 1
-PKG_MD5SUM:= 08722299c09753a5540a0752ec5b5fc7
+PKG_MD5SUM:= ff91738c4d3646d7999e00aa9923f2a0
PKG_DESCR:= X fonts
PKG_SECTION:= x11/fonts
PKG_BUILDDEP:= font-util
diff --git a/package/font-misc-misc/Makefile b/package/font-misc-misc/Makefile
index 7ea679a..a94bb31 100644
--- a/package/font-misc-misc/Makefile
+++ b/package/font-misc-misc/Makefile
@@ -4,9 +4,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= font-misc-misc
-PKG_VERSION:= 1.1.0
+PKG_VERSION:= 1.1.2
PKG_RELEASE:= 1
-PKG_MD5SUM:= 047eae4d061f17d96213c4e78f7abccb
+PKG_MD5SUM:= 23a79b92275375315129b440206c85b9
PKG_DESCR:= X fonts
PKG_SECTION:= x11/fonts
PKG_BUILDDEP:= font-util
diff --git a/package/font-xfree86-type1/Makefile b/package/font-xfree86-type1/Makefile
index 559bbb4..03e89da 100644
--- a/package/font-xfree86-type1/Makefile
+++ b/package/font-xfree86-type1/Makefile
@@ -4,9 +4,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= font-xfree86-type1
-PKG_VERSION:= 1.0.2
+PKG_VERSION:= 1.0.4
PKG_RELEASE:= 1
-PKG_MD5SUM:= 785f2b6e8d6d0dafec08b8d4c54ae2e3
+PKG_MD5SUM:= 89c33c5176cd580de6636ad50ce7777b
PKG_DESCR:= X fonts
PKG_SECTION:= x11/fonts
PKG_BUILDDEP:= font-util
diff --git a/package/fontsproto/Makefile b/package/fontsproto/Makefile
index 66cbe2a..9bc889f 100644
--- a/package/fontsproto/Makefile
+++ b/package/fontsproto/Makefile
@@ -4,9 +4,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= fontsproto
-PKG_VERSION:= 2.1.0
+PKG_VERSION:= 2.1.2
PKG_RELEASE:= 1
-PKG_MD5SUM:= 6819fc82585daac68cec17938b659bf0
+PKG_MD5SUM:= 642a8c5700519a84efe28944afe5cbdc
PKG_DESCR:= Fonts extension headers
PKG_SECTION:= x11/devel
PKG_SITES:= ${MASTER_SITE_XORG}
diff --git a/package/glproto/Makefile b/package/glproto/Makefile
index c4c970f..6c6aa68 100644
--- a/package/glproto/Makefile
+++ b/package/glproto/Makefile
@@ -4,11 +4,11 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= glproto
-PKG_VERSION:= 1.4.12
+PKG_VERSION:= 1.4.15
PKG_RELEASE:= 1
PKG_DESCR:= OpenGL headers
PKG_SECTION:= x11/devel
-PKG_MD5SUM:= c528c5903bb836b33a35863f97613c64
+PKG_MD5SUM:= be7c4e3c289db480b9e1238c03637eb7
PKG_SITES:= ${MASTER_SITE_XORG}
include $(TOPDIR)/mk/package.mk
diff --git a/package/inputproto/Makefile b/package/inputproto/Makefile
index c72d957..6c1b27b 100644
--- a/package/inputproto/Makefile
+++ b/package/inputproto/Makefile
@@ -4,11 +4,11 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= inputproto
-PKG_VERSION:= 2.0.1
+PKG_VERSION:= 2.2
PKG_RELEASE:= 1
PKG_DESCR:= X Input Extension headers
PKG_SECTION:= x11/devel
-PKG_MD5SUM:= 796829adecc14a78bfef8e119e6e9c63
+PKG_MD5SUM:= e0047823230413e67d74e92af77fbe58
PKG_SITES:= ${MASTER_SITE_XORG}
include $(TOPDIR)/mk/package.mk
diff --git a/package/kbproto/Makefile b/package/kbproto/Makefile
index e1bd153..9a06302 100644
--- a/package/kbproto/Makefile
+++ b/package/kbproto/Makefile
@@ -4,11 +4,11 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= kbproto
-PKG_VERSION:= 1.0.5
+PKG_VERSION:= 1.0.6
PKG_RELEASE:= 1
PKG_DESCR:= X11 keyboard protocol headers
PKG_SECTION:= x11/devel
-PKG_MD5SUM:= cb95bc6ffb2dfa27498aeb4663dee964
+PKG_MD5SUM:= 9c650b7947fe59b3f144518400e8d029
PKG_SITES:= ${MASTER_SITE_XORG}
include $(TOPDIR)/mk/package.mk
diff --git a/package/libICE/Makefile b/package/libICE/Makefile
index eb4cf17..dc7860a 100644
--- a/package/libICE/Makefile
+++ b/package/libICE/Makefile
@@ -4,9 +4,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= libICE
-PKG_VERSION:= 1.0.7
+PKG_VERSION:= 1.0.8
PKG_RELEASE:= 1
-PKG_MD5SUM:= 91ff02eb5af6073c2e014a5290e65f17
+PKG_MD5SUM:= 4b8dae73fce37e994c3a6fa05d6db7ca
PKG_DESCR:= Inter-Client Exchange library
PKG_SECTION:= x11/libs
PKG_BUILDDEP:= xtrans xproto
diff --git a/package/libICE/patches/patch-ltmain_sh b/package/libICE/patches/patch-ltmain_sh
deleted file mode 100644
index 92bc5c0..0000000
--- a/package/libICE/patches/patch-ltmain_sh
+++ /dev/null
@@ -1,11 +0,0 @@
---- libICE-1.0.6.orig/ltmain.sh 2009-05-18 04:30:07.000000000 +0200
-+++ libICE-1.0.6/ltmain.sh 2011-01-15 00:09:27.000000000 +0100
-@@ -4765,7 +4765,7 @@ func_mode_link ()
- # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC
- # @file GCC response files
- -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
-- -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*)
-+ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-fstack-protector*|-flto)
- func_quote_for_eval "$arg"
- arg="$func_quote_for_eval_result"
- func_append compile_command " $arg"
diff --git a/package/libSM/Makefile b/package/libSM/Makefile
index f452f71..be3e049 100644
--- a/package/libSM/Makefile
+++ b/package/libSM/Makefile
@@ -4,9 +4,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= libSM
-PKG_VERSION:= 1.2.0
+PKG_VERSION:= 1.2.1
PKG_RELEASE:= 1
-PKG_MD5SUM:= 4dcf47665aa64161bc5ca74c0778a149
+PKG_MD5SUM:= 1d507651e9fa50aab7ef11be9e0e2f20
PKG_DESCR:= X11 Session Management library
PKG_SECTION:= x11/libs
PKG_DEPENDS:= libuuid
diff --git a/package/libSM/patches/patch-ltmain_sh b/package/libSM/patches/patch-ltmain_sh
deleted file mode 100644
index 0d222af..0000000
--- a/package/libSM/patches/patch-ltmain_sh
+++ /dev/null
@@ -1,11 +0,0 @@
---- libSM-1.2.0.orig/ltmain.sh 2010-10-28 07:27:06.000000000 +0200
-+++ libSM-1.2.0/ltmain.sh 2011-01-24 18:32:41.000000000 +0100
-@@ -5091,7 +5091,7 @@ func_mode_link ()
- # @file GCC response files
- # -tp=* Portland pgcc target processor selection
- -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
-- -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*)
-+ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|-fstack-protector*|-flto*)
- func_quote_for_eval "$arg"
- arg="$func_quote_for_eval_result"
- func_append compile_command " $arg"
diff --git a/package/libX11/Makefile b/package/libX11/Makefile
index e53abb9..26baf5d 100644
--- a/package/libX11/Makefile
+++ b/package/libX11/Makefile
@@ -4,9 +4,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= libX11
-PKG_VERSION:= 1.4.0
+PKG_VERSION:= 1.5.0
PKG_RELEASE:= 1
-PKG_MD5SUM:= 3cb91f1f20884661b2b8aae03853441d
+PKG_MD5SUM:= 395455e4d3a51459374fe5ca8420aae8
PKG_DESCR:= X11 client-side library
PKG_SECTION:= x11/libs
PKG_BUILDDEP:= xproto xextproto xtrans libXdmcp libXau xcb-proto
diff --git a/package/libX11/patches/patch-ltmain_sh b/package/libX11/patches/patch-ltmain_sh
index 19c2fa8..28e1f1c 100644
--- a/package/libX11/patches/patch-ltmain_sh
+++ b/package/libX11/patches/patch-ltmain_sh
@@ -1,6 +1,6 @@
---- libX11-1.4.0.orig/ltmain.sh 2010-11-21 23:15:51.000000000 +0100
-+++ libX11-1.4.0/ltmain.sh 2011-01-24 16:20:51.000000000 +0100
-@@ -5840,7 +5840,7 @@ func_mode_link ()
+--- libX11-1.5.0.orig/ltmain.sh 2012-06-02 08:37:28.000000000 +0200
++++ libX11-1.5.0/ltmain.sh 2013-04-29 17:55:12.000000000 +0200
+@@ -5853,7 +5853,7 @@ func_mode_link ()
# -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
-64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
-t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
diff --git a/package/libX11/patches/patch-src_util_Makefile_in b/package/libX11/patches/patch-src_util_Makefile_in
index 6af15c2..70d1a33 100644
--- a/package/libX11/patches/patch-src_util_Makefile_in
+++ b/package/libX11/patches/patch-src_util_Makefile_in
@@ -1,6 +1,6 @@
---- libX11-1.4.0.orig/src/util/Makefile.in 2010-11-21 23:15:55.000000000 +0100
-+++ libX11-1.4.0/src/util/Makefile.in 2011-10-21 09:41:05.000000000 +0200
-@@ -143,7 +143,7 @@ LD = @LD@
+--- libX11-1.5.0.orig/src/util/Makefile.in 2012-06-02 08:37:33.000000000 +0200
++++ libX11-1.5.0/src/util/Makefile.in 2013-04-29 18:01:13.000000000 +0200
+@@ -144,7 +144,7 @@ LD = @LD@
LDFLAGS = @LDFLAGS_FOR_BUILD@
LDFLAGS_FOR_BUILD = @LDFLAGS_FOR_BUILD@
LIBOBJS = @LIBOBJS@
@@ -9,28 +9,34 @@
LIBTOOL = @LIBTOOL@
LIB_MAN_DIR = @LIB_MAN_DIR@
LIB_MAN_SUFFIX = @LIB_MAN_SUFFIX@
-@@ -262,8 +262,7 @@ top_build_prefix = @top_build_prefix@
+@@ -266,7 +266,6 @@ top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
makekeys_CFLAGS = \
- $(X11_CFLAGS) \
-- $(CWARNFLAGS)
-+ $(CWARNFLAGS) -I/usr/local/include
+ $(CWARNFLAGS)
- EXTRA_DIST = mkks.sh
-
-@@ -351,12 +350,12 @@ distclean-compile:
- @am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
+ makekeys_CPPFLAGS = \
+@@ -355,18 +354,18 @@ distclean-compile:
+ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
makekeys-makekeys.o: makekeys.c
--@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(makekeys_CFLAGS) $(CFLAGS) -MT makekeys-makekeys.o -MD -MP -MF $(DEPDIR)/makekeys-makekeys.Tpo -c -o makekeys-makekeys.o `test -f 'makekeys.c' || echo '$(srcdir)/'`makekeys.c
-+@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(makekeys_CFLAGS) $(CFLAGS_FOR_BUILD) -MT makekeys-makekeys.o -MD -MP -MF $(DEPDIR)/makekeys-makekeys.Tpo -c -o makekeys-makekeys.o `test -f 'makekeys.c' || echo '$(srcdir)/'`makekeys.c
+-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(makekeys_CPPFLAGS) $(CPPFLAGS) $(makekeys_CFLAGS) $(CFLAGS) -MT makekeys-makekeys.o -MD -MP -MF $(DEPDIR)/makekeys-makekeys.Tpo -c -o makekeys-makekeys.o `test -f 'makekeys.c' || echo '$(srcdir)/'`makekeys.c
++@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(makekeys_CPPFLAGS) $(CPPFLAGS) $(makekeys_CFLAGS) $(CFLAGS_FOR_BUILD) -MT makekeys-makekeys.o -MD -MP -MF $(DEPDIR)/makekeys-makekeys.Tpo -c -o makekeys-makekeys.o `test -f 'makekeys.c' || echo '$(srcdir)/'`makekeys.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/makekeys-makekeys.Tpo $(DEPDIR)/makekeys-makekeys.Po
- @am__fastdepCC_FALSE@ $(AM_V_CC) @AM_BACKSLASH@
- @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='makekeys.c' object='makekeys-makekeys.o' libtool=no @AMDEPBACKSLASH@
+ @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='makekeys.c' object='makekeys-makekeys.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
--@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(makekeys_CFLAGS) $(CFLAGS) -c -o makekeys-makekeys.o `test -f 'makekeys.c' || echo '$(srcdir)/'`makekeys.c
-+@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(makekeys_CFLAGS) $(CFLAGS_FOR_BUILD) -c -o makekeys-makekeys.o `test -f 'makekeys.c' || echo '$(srcdir)/'`makekeys.c
+-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(makekeys_CPPFLAGS) $(CPPFLAGS) $(makekeys_CFLAGS) $(CFLAGS) -c -o makekeys-makekeys.o `test -f 'makekeys.c' || echo '$(srcdir)/'`makekeys.c
++@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(makekeys_CPPFLAGS) $(CPPFLAGS) $(makekeys_CFLAGS) $(CFLAGS_FOR_BUILD) -c -o makekeys-makekeys.o `test -f 'makekeys.c' || echo '$(srcdir)/'`makekeys.c
makekeys-makekeys.obj: makekeys.c
- @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(makekeys_CFLAGS) $(CFLAGS) -MT makekeys-makekeys.obj -MD -MP -MF $(DEPDIR)/makekeys-makekeys.Tpo -c -o makekeys-makekeys.obj `if test -f 'makekeys.c'; then $(CYGPATH_W) 'makekeys.c'; else $(CYGPATH_W) '$(srcdir)/makekeys.c'; fi`
+-@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(makekeys_CPPFLAGS) $(CPPFLAGS) $(makekeys_CFLAGS) $(CFLAGS) -MT makekeys-makekeys.obj -MD -MP -MF $(DEPDIR)/makekeys-makekeys.Tpo -c -o makekeys-makekeys.obj `if test -f 'makekeys.c'; then $(CYGPATH_W) 'makekeys.c'; else $(CYGPATH_W) '$(srcdir)/makekeys.c'; fi`
++@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(makekeys_CPPFLAGS) $(CPPFLAGS) $(makekeys_CFLAGS) $(CFLAGS_FOR_BUILD) -MT makekeys-makekeys.obj -MD -MP -MF $(DEPDIR)/makekeys-makekeys.Tpo -c -o makekeys-makekeys.obj `if test -f 'makekeys.c'; then $(CYGPATH_W) 'makekeys.c'; else $(CYGPATH_W) '$(srcdir)/makekeys.c'; fi`
+ @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/makekeys-makekeys.Tpo $(DEPDIR)/makekeys-makekeys.Po
+ @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='makekeys.c' object='makekeys-makekeys.obj' libtool=no @AMDEPBACKSLASH@
+ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(makekeys_CPPFLAGS) $(CPPFLAGS) $(makekeys_CFLAGS) $(CFLAGS) -c -o makekeys-makekeys.obj `if test -f 'makekeys.c'; then $(CYGPATH_W) 'makekeys.c'; else $(CYGPATH_W) '$(srcdir)/makekeys.c'; fi`
++@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(makekeys_CPPFLAGS) $(CPPFLAGS) $(makekeys_CFLAGS) $(CFLAGS_FOR_BUILD) -c -o makekeys-makekeys.obj `if test -f 'makekeys.c'; then $(CYGPATH_W) 'makekeys.c'; else $(CYGPATH_W) '$(srcdir)/makekeys.c'; fi`
+
+ mostlyclean-libtool:
+ -rm -f *.lo
diff --git a/package/libXau/Makefile b/package/libXau/Makefile
index 2fb248b..7ef1f8f 100644
--- a/package/libXau/Makefile
+++ b/package/libXau/Makefile
@@ -4,9 +4,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= libXau
-PKG_VERSION:= 1.0.6
+PKG_VERSION:= 1.0.7
PKG_RELEASE:= 1
-PKG_MD5SUM:= ee1ee30c00d1e033cfc0237a349e1219
+PKG_MD5SUM:= 3ab7a4d1aac1b7f8ccc6b9755a19f252
PKG_DESCR:= X11 authorisation library
PKG_SECTION:= x11/libs
PKG_BUILDDEP:= xproto
diff --git a/package/libXau/patches/patch-ltmain_sh b/package/libXau/patches/patch-ltmain_sh
deleted file mode 100644
index 065bd8d..0000000
--- a/package/libXau/patches/patch-ltmain_sh
+++ /dev/null
@@ -1,11 +0,0 @@
---- libXau-1.0.5.orig/ltmain.sh 2009-05-18 04:20:07.000000000 +0200
-+++ libXau-1.0.5/ltmain.sh 2011-01-14 00:48:29.000000000 +0100
-@@ -4765,7 +4765,7 @@ func_mode_link ()
- # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC
- # @file GCC response files
- -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
-- -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*)
-+ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-fstack-protector*|-flto)
- func_quote_for_eval "$arg"
- arg="$func_quote_for_eval_result"
- func_append compile_command " $arg"
diff --git a/package/libXaw/Makefile b/package/libXaw/Makefile
index 160c988..67e7482 100644
--- a/package/libXaw/Makefile
+++ b/package/libXaw/Makefile
@@ -4,9 +4,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= libXaw
-PKG_VERSION:= 1.0.8
+PKG_VERSION:= 1.0.11
PKG_RELEASE:= 1
-PKG_MD5SUM:= ae09e00c5b7e2b12a11a7db4d4b01d73
+PKG_MD5SUM:= c487a810a8a9b0eb5091f382790b4e75
PKG_DESCR:= X11 Athena Widget library
PKG_SECTION:= x11/libs
PKG_BUILDDEP:= libXext libXmu libXpm
diff --git a/package/libXaw/patches/patch-ltmain_sh b/package/libXaw/patches/patch-ltmain_sh
deleted file mode 100644
index 71e9909..0000000
--- a/package/libXaw/patches/patch-ltmain_sh
+++ /dev/null
@@ -1,11 +0,0 @@
---- libXaw-1.0.8.orig/ltmain.sh 2010-10-25 19:47:33.000000000 +0200
-+++ libXaw-1.0.8/ltmain.sh 2011-01-24 18:43:21.000000000 +0100
-@@ -5091,7 +5091,7 @@ func_mode_link ()
- # @file GCC response files
- # -tp=* Portland pgcc target processor selection
- -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
-- -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*)
-+ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|-fstack-protector*|-flto*)
- func_quote_for_eval "$arg"
- arg="$func_quote_for_eval_result"
- func_append compile_command " $arg"
diff --git a/package/libXcursor/Makefile b/package/libXcursor/Makefile
index f60851a..b007823 100644
--- a/package/libXcursor/Makefile
+++ b/package/libXcursor/Makefile
@@ -4,15 +4,17 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= libXcursor
-PKG_VERSION:= 1.1.11
+PKG_VERSION:= 1.1.13
PKG_RELEASE:= 1
-PKG_MD5SUM:= 55558a41d0bcf9210636858844fa4d2f
+PKG_MD5SUM:= 38a6c7ce393cb5bc10e67de087f9d582
PKG_DESCR:= xcursor library
PKG_SECTION:= x11/libs
PKG_SITES:= ${MASTER_SITE_XORG}
PKG_BUILDDEP:= libXfixes libXrender
PKG_SUBPKGS:= LIBXCURSOR LIBXCURSOR_DEV
+PKGSC_LIBXCURSOR_DEV:= x11/devel
+PKGSD_LIBXCURSOR_DEV:= libXcursor development files
include $(TOPDIR)/mk/package.mk
diff --git a/package/libXcursor/patches/patch-ltmain_sh b/package/libXcursor/patches/patch-ltmain_sh
deleted file mode 100644
index e78e572..0000000
--- a/package/libXcursor/patches/patch-ltmain_sh
+++ /dev/null
@@ -1,11 +0,0 @@
---- libXcursor-1.1.11.orig/ltmain.sh 2010-10-28 07:48:42.000000000 +0200
-+++ libXcursor-1.1.11/ltmain.sh 2011-01-15 22:22:45.000000000 +0100
-@@ -5091,7 +5091,7 @@ func_mode_link ()
- # @file GCC response files
- # -tp=* Portland pgcc target processor selection
- -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
-- -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*)
-+ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|-fstack-protector*|-flto)
- func_quote_for_eval "$arg"
- arg="$func_quote_for_eval_result"
- func_append compile_command " $arg"
diff --git a/package/libXdmcp/Makefile b/package/libXdmcp/Makefile
index 0bfa004..0bde786 100644
--- a/package/libXdmcp/Makefile
+++ b/package/libXdmcp/Makefile
@@ -4,9 +4,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= libXdmcp
-PKG_VERSION:= 1.1.0
+PKG_VERSION:= 1.1.1
PKG_RELEASE:= 1
-PKG_MD5SUM:= bd6577d65c66a971ca52ba7c251905a8
+PKG_MD5SUM:= 194f30d2bb67b23dc33351e128db40a9
PKG_DESCR:= X11 display manager control protocol library
PKG_SECTION:= x11/libs
PKG_BUILDDEP:= xproto
diff --git a/package/libXdmcp/patches/patch-ltmain_sh b/package/libXdmcp/patches/patch-ltmain_sh
deleted file mode 100644
index 27bebbf..0000000
--- a/package/libXdmcp/patches/patch-ltmain_sh
+++ /dev/null
@@ -1,11 +0,0 @@
---- libXdmcp-1.1.0.orig/ltmain.sh 2010-10-30 00:13:50.000000000 +0200
-+++ libXdmcp-1.1.0/ltmain.sh 2011-01-24 13:16:31.000000000 +0100
-@@ -5091,7 +5091,7 @@ func_mode_link ()
- # @file GCC response files
- # -tp=* Portland pgcc target processor selection
- -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
-- -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*)
-+ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|-fstack-protector*|-flto)
- func_quote_for_eval "$arg"
- arg="$func_quote_for_eval_result"
- func_append compile_command " $arg"
diff --git a/package/libXext/Makefile b/package/libXext/Makefile
index f0d716b..25760a9 100644
--- a/package/libXext/Makefile
+++ b/package/libXext/Makefile
@@ -4,9 +4,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= libXext
-PKG_VERSION:= 1.2.0
+PKG_VERSION:= 1.3.1
PKG_RELEASE:= 1
-PKG_MD5SUM:= 9beee7f603907840de9d9e73172e74d0
+PKG_MD5SUM:= 249478eae5c4fab7722894cb99565405
PKG_DESCR:= X client interface to extensions of the X protocol
PKG_SECTION:= x11/libs
PKG_BUILDDEP:= libX11 xextproto
diff --git a/package/libXext/patches/patch-ltmain_sh b/package/libXext/patches/patch-ltmain_sh
deleted file mode 100644
index 8a74a50..0000000
--- a/package/libXext/patches/patch-ltmain_sh
+++ /dev/null
@@ -1,11 +0,0 @@
---- libXext-1.2.0.orig/ltmain.sh 2010-10-28 08:07:34.000000000 +0200
-+++ libXext-1.2.0/ltmain.sh 2011-01-24 17:32:32.000000000 +0100
-@@ -5091,7 +5091,7 @@ func_mode_link ()
- # @file GCC response files
- # -tp=* Portland pgcc target processor selection
- -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
-- -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*)
-+ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|-fstack-protector*|-flto*)
- func_quote_for_eval "$arg"
- arg="$func_quote_for_eval_result"
- func_append compile_command " $arg"
diff --git a/package/libXfixes/Makefile b/package/libXfixes/Makefile
index f98ab84..96c0c82 100644
--- a/package/libXfixes/Makefile
+++ b/package/libXfixes/Makefile
@@ -4,9 +4,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= libXfixes
-PKG_VERSION:= 4.0.5
+PKG_VERSION:= 5.0
PKG_RELEASE:= 1
-PKG_MD5SUM:= 556ffa2e75f2a3b5d92d004a6b124a6d
+PKG_MD5SUM:= 0a2139e91df4758218e0fddbd549e13c
PKG_DESCR:= X Fixes Library
PKG_SECTION:= x11/libs
PKG_BUILDDEP:= fixesproto xextproto xproto libX11
diff --git a/package/libXfont/Makefile b/package/libXfont/Makefile
index 1c166be..10bd5c9 100644
--- a/package/libXfont/Makefile
+++ b/package/libXfont/Makefile
@@ -4,9 +4,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= libXfont
-PKG_VERSION:= 1.4.3
+PKG_VERSION:= 1.4.5
PKG_RELEASE:= 1
-PKG_MD5SUM:= c508998fba44b2b089f2952eb4418420
+PKG_MD5SUM:= a54dea0debecf232a346c22e71d76836
PKG_DESCR:= X font Library
PKG_SECTION:= x11/libs
PKG_DEPENDS:= libfreetype
diff --git a/package/libXfont/patches/patch-ltmain_sh b/package/libXfont/patches/patch-ltmain_sh
deleted file mode 100644
index 226c3e9..0000000
--- a/package/libXfont/patches/patch-ltmain_sh
+++ /dev/null
@@ -1,11 +0,0 @@
---- libXfont-1.4.3.orig/ltmain.sh 2010-10-29 05:43:52.000000000 +0200
-+++ libXfont-1.4.3/ltmain.sh 2011-01-24 17:02:07.000000000 +0100
-@@ -5091,7 +5091,7 @@ func_mode_link ()
- # @file GCC response files
- # -tp=* Portland pgcc target processor selection
- -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
-- -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*)
-+ -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|-fstack-protector*|-flto)
- func_quote_for_eval "$arg"
- arg="$func_quote_for_eval_result"
- func_append compile_command " $arg"
diff --git a/package/libXft/Makefile b/package/libXft/Makefile
index b412fa8..9a3cb5a 100644
--- a/package/libXft/Makefile
+++ b/package/libXft/Makefile
@@ -4,9 +4,9 @@
include $(TOPDIR)/rules.mk
PKG_NAME:= libXft
-PKG_VERSION:= 2.1.9
+PKG_VERSION:= 2.3.1
PKG_RELEASE:= 1
-PKG_MD5SUM:= 0a1e129b1d8b2d3905dc02a64255b781
+PKG_MD5SUM:= 946a157090eec5c3041cf17530d93f59
PKG_DESCR:= X FreeType library
PKG_SECTION:= x11/libs
PKG_BUILDDEP:= libXrender fontconfig
diff --git a/package/libXft/patches/autotool.patch b/package/libXft/patches/autotool.patch
deleted file mode 100644
index 2692700..0000000
--- a/package/libXft/patches/autotool.patch
+++ /dev/null
@@ -1,63433 +0,0 @@
-older libtool is unecessary checking for c++
-
- * regen autotool infrastruture via
- "libtoolize; autoregen -vif; rm -rf automa4te"
- * add fstack-protector patch manually
-
-diff -Nur libXft-2.1.9.orig/aclocal.m4 libXft-2.1.9/aclocal.m4
---- libXft-2.1.9.orig/aclocal.m4 2006-06-03 12:33:23.000000000 +0200
-+++ libXft-2.1.9/aclocal.m4 2011-02-16 21:01:09.004802039 +0100
-@@ -1,7 +1,7 @@
--# generated automatically by aclocal 1.9.6 -*- Autoconf -*-
-+# generated automatically by aclocal 1.11.1 -*- Autoconf -*-
-
- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
--# 2005 Free Software Foundation, Inc.
-+# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
- # This file is free software; the Free Software Foundation
- # gives unlimited permission to copy and/or distribute it,
- # with or without modifications, as long as this notice is preserved.
-@@ -11,103 +11,196 @@
- # even the implied warranty of MERCHANTABILITY or FITNESS FOR A
- # PARTICULAR PURPOSE.
-
-+m4_ifndef([AC_AUTOCONF_VERSION],
-+ [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
-+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.65],,
-+[m4_warning([this file was generated for autoconf 2.65.
-+You have another version of autoconf. It may work, but is not guaranteed to.
-+If you have problems, you may need to regenerate the build system entirely.
-+To do so, use the procedure documented by the package, typically `autoreconf'.])])
-+
- # libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
-+#
-+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-+# 2006, 2007, 2008 Free Software Foundation, Inc.
-+# Written by Gordon Matzigkeit, 1996
-+#
-+# This file is free software; the Free Software Foundation gives
-+# unlimited permission to copy and/or distribute it, with or without
-+# modifications, as long as this notice is preserved.
-+
-+m4_define([_LT_COPYING], [dnl
-+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
-+# 2006, 2007, 2008 Free Software Foundation, Inc.
-+# Written by Gordon Matzigkeit, 1996
-+#
-+# This file is part of GNU Libtool.
-+#
-+# GNU Libtool is free software; you can redistribute it and/or
-+# modify it under the terms of the GNU General Public License as
-+# published by the Free Software Foundation; either version 2 of
-+# the License, or (at your option) any later version.
-+#
-+# As a special exception to the GNU General Public License,
-+# if you distribute this file as part of a program or library that
-+# is built using GNU Libtool, you may include this file under the
-+# same distribution terms that you use for the rest of that program.
-+#
-+# GNU Libtool is distributed in the hope that it will be useful,
-+# but WITHOUT ANY WARRANTY; without even the implied warranty of
-+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-+# GNU General Public License for more details.
-+#
-+# You should have received a copy of the GNU General Public License
-+# along with GNU Libtool; see the file COPYING. If not, a copy
-+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
-+# obtained by writing to the Free Software Foundation, Inc.,
-+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-+])
-
--# serial 48 Debian 1.5.22-2 AC_PROG_LIBTOOL
-+# serial 56 LT_INIT
-
-
--# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED)
--# -----------------------------------------------------------
--# If this macro is not defined by Autoconf, define it here.
--m4_ifdef([AC_PROVIDE_IFELSE],
-- [],
-- [m4_define([AC_PROVIDE_IFELSE],
-- [m4_ifdef([AC_PROVIDE_$1],
-- [$2], [$3])])])
-+# LT_PREREQ(VERSION)
-+# ------------------
-+# Complain and exit if this libtool version is less that VERSION.
-+m4_defun([LT_PREREQ],
-+[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
-+ [m4_default([$3],
-+ [m4_fatal([Libtool version $1 or higher is required],
-+ 63)])],
-+ [$2])])
-
-
--# AC_PROG_LIBTOOL
--# ---------------
--AC_DEFUN([AC_PROG_LIBTOOL],
--[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl
--dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX
--dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX.
-- AC_PROVIDE_IFELSE([AC_PROG_CXX],
-- [AC_LIBTOOL_CXX],
-- [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX
-- ])])
--dnl And a similar setup for Fortran 77 support
-- AC_PROVIDE_IFELSE([AC_PROG_F77],
-- [AC_LIBTOOL_F77],
-- [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77
--])])
--
--dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly.
--dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run
--dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both.
-- AC_PROVIDE_IFELSE([AC_PROG_GCJ],
-- [AC_LIBTOOL_GCJ],
-- [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
-- [AC_LIBTOOL_GCJ],
-- [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],
-- [AC_LIBTOOL_GCJ],
-- [ifdef([AC_PROG_GCJ],
-- [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])
-- ifdef([A][M_PROG_GCJ],
-- [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])])
-- ifdef([LT_AC_PROG_GCJ],
-- [define([LT_AC_PROG_GCJ],
-- defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])])
--])])# AC_PROG_LIBTOOL
-+# _LT_CHECK_BUILDDIR
-+# ------------------
-+# Complain if the absolute build directory name contains unusual characters
-+m4_defun([_LT_CHECK_BUILDDIR],
-+[case `pwd` in
-+ *\ * | *\ *)
-+ AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
-+esac
-+])
-
-
--# _AC_PROG_LIBTOOL
--# ----------------
--AC_DEFUN([_AC_PROG_LIBTOOL],
--[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl
--AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl
--AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl
--AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl
-+# LT_INIT([OPTIONS])
-+# ------------------
-+AC_DEFUN([LT_INIT],
-+[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
-+AC_BEFORE([$0], [LT_LANG])dnl
-+AC_BEFORE([$0], [LT_OUTPUT])dnl
-+AC_BEFORE([$0], [LTDL_INIT])dnl
-+m4_require([_LT_CHECK_BUILDDIR])dnl
-+
-+dnl Autoconf doesn't catch unexpanded LT_ macros by default:
-+m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
-+m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
-+dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
-+dnl unless we require an AC_DEFUNed macro:
-+AC_REQUIRE([LTOPTIONS_VERSION])dnl
-+AC_REQUIRE([LTSUGAR_VERSION])dnl
-+AC_REQUIRE([LTVERSION_VERSION])dnl
-+AC_REQUIRE([LTOBSOLETE_VERSION])dnl
-+m4_require([_LT_PROG_LTMAIN])dnl
-+
-+dnl Parse OPTIONS
-+_LT_SET_OPTIONS([$0], [$1])
-
- # This can be used to rebuild libtool when needed
--LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
-+LIBTOOL_DEPS="$ltmain"
-
- # Always use our own libtool.
- LIBTOOL='$(SHELL) $(top_builddir)/libtool'
- AC_SUBST(LIBTOOL)dnl
-
--# Prevent multiple expansion
--define([AC_PROG_LIBTOOL], [])
--])# _AC_PROG_LIBTOOL
-+_LT_SETUP
-
-+# Only expand once:
-+m4_define([LT_INIT])
-+])# LT_INIT
-+
-+# Old names:
-+AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
-+AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
-+dnl aclocal-1.4 backwards compatibility:
-+dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
-+dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
-
--# AC_LIBTOOL_SETUP
--# ----------------
--AC_DEFUN([AC_LIBTOOL_SETUP],
--[AC_PREREQ(2.50)dnl
--AC_REQUIRE([AC_ENABLE_SHARED])dnl
--AC_REQUIRE([AC_ENABLE_STATIC])dnl
--AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl
--AC_REQUIRE([AC_CANONICAL_HOST])dnl
-+
-+# _LT_CC_BASENAME(CC)
-+# -------------------
-+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
-+m4_defun([_LT_CC_BASENAME],
-+[for cc_temp in $1""; do
-+ case $cc_temp in
-+ compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
-+ distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
-+ \-*) ;;
-+ *) break;;
-+ esac
-+done
-+cc_basename=`$ECHO "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
-+])
-+
-+
-+# _LT_FILEUTILS_DEFAULTS
-+# ----------------------
-+# It is okay to use these file commands and assume they have been set
-+# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
-+m4_defun([_LT_FILEUTILS_DEFAULTS],
-+[: ${CP="cp -f"}
-+: ${MV="mv -f"}
-+: ${RM="rm -f"}
-+])# _LT_FILEUTILS_DEFAULTS
-+
-+
-+# _LT_SETUP
-+# ---------
-+m4_defun([_LT_SETUP],
-+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
- AC_REQUIRE([AC_CANONICAL_BUILD])dnl
-+_LT_DECL([], [host_alias], [0], [The host system])dnl
-+_LT_DECL([], [host], [0])dnl
-+_LT_DECL([], [host_os], [0])dnl
-+dnl
-+_LT_DECL([], [build_alias], [0], [The build system])dnl
-+_LT_DECL([], [build], [0])dnl
-+_LT_DECL([], [build_os], [0])dnl
-+dnl
- AC_REQUIRE([AC_PROG_CC])dnl
--AC_REQUIRE([AC_PROG_LD])dnl
--AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl
--AC_REQUIRE([AC_PROG_NM])dnl
--
-+AC_REQUIRE([LT_PATH_LD])dnl
-+AC_REQUIRE([LT_PATH_NM])dnl
-+dnl
- AC_REQUIRE([AC_PROG_LN_S])dnl
--AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl
--# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
--AC_REQUIRE([AC_OBJEXT])dnl
--AC_REQUIRE([AC_EXEEXT])dnl
-+test -z "$LN_S" && LN_S="ln -s"
-+_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
-+dnl
-+AC_REQUIRE([LT_CMD_MAX_LEN])dnl
-+_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
-+_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
- dnl
-+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
-+m4_require([_LT_CMD_RELOAD])dnl
-+m4_require([_LT_CHECK_MAGIC_METHOD])dnl
-+m4_require([_LT_CMD_OLD_ARCHIVE])dnl
-+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
-+
-+_LT_CONFIG_LIBTOOL_INIT([
-+# See if we are running on zsh, and set the options which allow our
-+# commands through without removal of \ escapes INIT.
-+if test -n "\${ZSH_VERSION+set}" ; then
-+ setopt NO_GLOB_SUBST
-+fi
-+])
-+if test -n "${ZSH_VERSION+set}" ; then
-+ setopt NO_GLOB_SUBST
-+fi
-
--AC_LIBTOOL_SYS_MAX_CMD_LEN
--AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
--AC_LIBTOOL_OBJDIR
-+_LT_CHECK_OBJDIR
-
--AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
--_LT_AC_PROG_ECHO_BACKSLASH
-+m4_require([_LT_TAG_COMPILER])dnl
-+_LT_PROG_ECHO_BACKSLASH
-
- case $host_os in
- aix3*)
-@@ -123,6299 +216,7775 @@
-
- # Sed substitution that helps us do robust quoting. It backslashifies
- # metacharacters that are still active within double-quoted strings.
--Xsed='sed -e 1s/^X//'
--[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g']
-+sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
-
- # Same as above, but do not quote variable references.
--[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g']
-+double_quote_subst='s/\([["`\\]]\)/\\\1/g'
-
- # Sed substitution to delay expansion of an escaped shell variable in a
- # double_quote_subst'ed string.
- delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
-
-+# Sed substitution to delay expansion of an escaped single quote.
-+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
-+
- # Sed substitution to avoid accidental globbing in evaled expressions
- no_glob_subst='s/\*/\\\*/g'
-
--# Constants:
--rm="rm -f"
--
- # Global variables:
--default_ofile=libtool
-+ofile=libtool
- can_build_shared=yes
-
- # All known linkers require a `.a' archive for static linking (except MSVC,
- # which needs '.lib').
- libext=a
--ltmain="$ac_aux_dir/ltmain.sh"
--ofile="$default_ofile"
--with_gnu_ld="$lt_cv_prog_gnu_ld"
-
--AC_CHECK_TOOL(AR, ar, false)
--AC_CHECK_TOOL(RANLIB, ranlib, :)
--AC_CHECK_TOOL(STRIP, strip, :)
-+with_gnu_ld="$lt_cv_prog_gnu_ld"
-
- old_CC="$CC"
- old_CFLAGS="$CFLAGS"
-
- # Set sane defaults for various variables
--test -z "$AR" && AR=ar
--test -z "$AR_FLAGS" && AR_FLAGS=cru
--test -z "$AS" && AS=as
- test -z "$CC" && CC=cc
- test -z "$LTCC" && LTCC=$CC
- test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
--test -z "$DLLTOOL" && DLLTOOL=dlltool
- test -z "$LD" && LD=ld
--test -z "$LN_S" && LN_S="ln -s"
--test -z "$MAGIC_CMD" && MAGIC_CMD=file
--test -z "$NM" && NM=nm
--test -z "$SED" && SED=sed
--test -z "$OBJDUMP" && OBJDUMP=objdump
--test -z "$RANLIB" && RANLIB=:
--test -z "$STRIP" && STRIP=:
- test -z "$ac_objext" && ac_objext=o
-
--# Determine commands to create old-style static archives.
--old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs'
--old_postinstall_cmds='chmod 644 $oldlib'
--old_postuninstall_cmds=
--
--if test -n "$RANLIB"; then
-- case $host_os in
-- openbsd*)
-- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
-- ;;
-- *)
-- old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
-- ;;
-- esac
-- old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
--fi
--
- _LT_CC_BASENAME([$compiler])
-
- # Only perform the check for file, if the check method requires it
-+test -z "$MAGIC_CMD" && MAGIC_CMD=file
- case $deplibs_check_method in
- file_magic*)
- if test "$file_magic_cmd" = '$MAGIC_CMD'; then
-- AC_PATH_MAGIC
-+ _LT_PATH_MAGIC
- fi
- ;;
- esac
-
--AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no)
--AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
--enable_win32_dll=yes, enable_win32_dll=no)
--
--AC_ARG_ENABLE([libtool-lock],
-- [AC_HELP_STRING([--disable-libtool-lock],
-- [avoid locking (might break parallel builds)])])
--test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-+# Use C for the default configuration in the libtool script
-+LT_SUPPORTED_TAG([CC])
-+_LT_LANG_C_CONFIG
-+_LT_LANG_DEFAULT_CONFIG
-+_LT_CONFIG_COMMANDS
-+])# _LT_SETUP
-
--AC_ARG_WITH([pic],
-- [AC_HELP_STRING([--with-pic],
-- [try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
-- [pic_mode="$withval"],
-- [pic_mode=default])
--test -z "$pic_mode" && pic_mode=default
-
--# Use C for the default configuration in the libtool script
--tagname=
--AC_LIBTOOL_LANG_C_CONFIG
--_LT_AC_TAGCONFIG
--])# AC_LIBTOOL_SETUP
-+# _LT_PROG_LTMAIN
-+# ---------------
-+# Note that this code is called both from `configure', and `config.status'
-+# now that we use AC_CONFIG_COMMANDS to generate libtool. Notably,
-+# `config.status' has no value for ac_aux_dir unless we are using Automake,
-+# so we pass a copy along to make sure it has a sensible value anyway.
-+m4_defun([_LT_PROG_LTMAIN],
-+[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
-+_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
-+ltmain="$ac_aux_dir/ltmain.sh"
-+])# _LT_PROG_LTMAIN
-
-
--# _LT_AC_SYS_COMPILER
--# -------------------
--AC_DEFUN([_LT_AC_SYS_COMPILER],
--[AC_REQUIRE([AC_PROG_CC])dnl
-
--# If no C compiler was specified, use CC.
--LTCC=${LTCC-"$CC"}
-+# So that we can recreate a full libtool script including additional
-+# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
-+# in macros and then make a single call at the end using the `libtool'
-+# label.
-
--# If no C compiler flags were specified, use CFLAGS.
--LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
--# Allow CC to be a program name with arguments.
--compiler=$CC
--])# _LT_AC_SYS_COMPILER
-+# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
-+# ----------------------------------------
-+# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
-+m4_define([_LT_CONFIG_LIBTOOL_INIT],
-+[m4_ifval([$1],
-+ [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
-+ [$1
-+])])])
-
-+# Initialize.
-+m4_define([_LT_OUTPUT_LIBTOOL_INIT])
-
--# _LT_CC_BASENAME(CC)
--# -------------------
--# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
--AC_DEFUN([_LT_CC_BASENAME],
--[for cc_temp in $1""; do
-- case $cc_temp in
-- compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
-- distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
-- \-*) ;;
-- *) break;;
-- esac
--done
--cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
-+
-+# _LT_CONFIG_LIBTOOL([COMMANDS])
-+# ------------------------------
-+# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
-+m4_define([_LT_CONFIG_LIBTOOL],
-+[m4_ifval([$1],
-+ [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
-+ [$1
-+])])])
-+
-+# Initialize.
-+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
-+
-+
-+# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
-+# -----------------------------------------------------
-+m4_defun([_LT_CONFIG_SAVE_COMMANDS],
-+[_LT_CONFIG_LIBTOOL([$1])
-+_LT_CONFIG_LIBTOOL_INIT([$2])
- ])
-
-
--# _LT_COMPILER_BOILERPLATE
--# ------------------------
--# Check for compiler boilerplate output or warnings with
--# the simple compiler test code.
--AC_DEFUN([_LT_COMPILER_BOILERPLATE],
--[ac_outfile=conftest.$ac_objext
--printf "$lt_simple_compile_test_code" >conftest.$ac_ext
--eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
--_lt_compiler_boilerplate=`cat conftest.err`
--$rm conftest*
--])# _LT_COMPILER_BOILERPLATE
-+# _LT_FORMAT_COMMENT([COMMENT])
-+# -----------------------------
-+# Add leading comment marks to the start of each line, and a trailing
-+# full-stop to the whole comment if one is not present already.
-+m4_define([_LT_FORMAT_COMMENT],
-+[m4_ifval([$1], [
-+m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
-+ [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
-+)])
-
-
--# _LT_LINKER_BOILERPLATE
--# ----------------------
--# Check for linker boilerplate output or warnings with
--# the simple link test code.
--AC_DEFUN([_LT_LINKER_BOILERPLATE],
--[ac_outfile=conftest.$ac_objext
--printf "$lt_simple_link_test_code" >conftest.$ac_ext
--eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
--_lt_linker_boilerplate=`cat conftest.err`
--$rm conftest*
--])# _LT_LINKER_BOILERPLATE
-
-
--# _LT_AC_SYS_LIBPATH_AIX
--# ----------------------
--# Links a minimal program and checks the executable
--# for the system default hardcoded library path. In most cases,
--# this is /usr/lib:/lib, but when the MPI compilers are used
--# the location of the communication and MPI libs are included too.
--# If we don't find anything, use the default library path according
--# to the aix ld manual.
--AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX],
--[AC_LINK_IFELSE(AC_LANG_PROGRAM,[
--aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
--}'`
--# Check for a 64-bit object if we didn't find anything.
--if test -z "$aix_libpath"; then aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; }
--}'`; fi],[])
--if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
--])# _LT_AC_SYS_LIBPATH_AIX
-
-+# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
-+# -------------------------------------------------------------------
-+# CONFIGNAME is the name given to the value in the libtool script.
-+# VARNAME is the (base) name used in the configure script.
-+# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
-+# VARNAME. Any other value will be used directly.
-+m4_define([_LT_DECL],
-+[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
-+ [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
-+ [m4_ifval([$1], [$1], [$2])])
-+ lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
-+ m4_ifval([$4],
-+ [lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
-+ lt_dict_add_subkey([lt_decl_dict], [$2],
-+ [tagged?], [m4_ifval([$5], [yes], [no])])])
-+])
-
--# _LT_AC_SHELL_INIT(ARG)
--# ----------------------
--AC_DEFUN([_LT_AC_SHELL_INIT],
--[ifdef([AC_DIVERSION_NOTICE],
-- [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
-- [AC_DIVERT_PUSH(NOTICE)])
--$1
--AC_DIVERT_POP
--])# _LT_AC_SHELL_INIT
-
-+# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
-+# --------------------------------------------------------
-+m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
-+
-+
-+# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
-+# ------------------------------------------------
-+m4_define([lt_decl_tag_varnames],
-+[_lt_decl_filter([tagged?], [yes], $@)])
-+
-+
-+# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
-+# ---------------------------------------------------------
-+m4_define([_lt_decl_filter],
-+[m4_case([$#],
-+ [0], [m4_fatal([$0: too few arguments: $#])],
-+ [1], [m4_fatal([$0: too few arguments: $#: $1])],
-+ [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
-+ [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
-+ [lt_dict_filter([lt_decl_dict], $@)])[]dnl
-+])
-
--# _LT_AC_PROG_ECHO_BACKSLASH
--# --------------------------
--# Add some code to the start of the generated configure script which
--# will find an echo command which doesn't interpret backslashes.
--AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH],
--[_LT_AC_SHELL_INIT([
--# Check that we are running under the correct shell.
--SHELL=${CONFIG_SHELL-/bin/sh}
-
--case X$ECHO in
--X*--fallback-echo)
-- # Remove one level of quotation (which was required for Make).
-- ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
-- ;;
--esac
-+# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
-+# --------------------------------------------------
-+m4_define([lt_decl_quote_varnames],
-+[_lt_decl_filter([value], [1], $@)])
-+
-+
-+# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
-+# ---------------------------------------------------
-+m4_define([lt_decl_dquote_varnames],
-+[_lt_decl_filter([value], [2], $@)])
-+
-+
-+# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
-+# ---------------------------------------------------
-+m4_define([lt_decl_varnames_tagged],
-+[m4_assert([$# <= 2])dnl
-+_$0(m4_quote(m4_default([$1], [[, ]])),
-+ m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
-+ m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
-+m4_define([_lt_decl_varnames_tagged],
-+[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
-+
-+
-+# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
-+# ------------------------------------------------
-+m4_define([lt_decl_all_varnames],
-+[_$0(m4_quote(m4_default([$1], [[, ]])),
-+ m4_if([$2], [],
-+ m4_quote(lt_decl_varnames),
-+ m4_quote(m4_shift($@))))[]dnl
-+])
-+m4_define([_lt_decl_all_varnames],
-+[lt_join($@, lt_decl_varnames_tagged([$1],
-+ lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
-+])
-
--echo=${ECHO-echo}
--if test "X[$]1" = X--no-reexec; then
-- # Discard the --no-reexec flag, and continue.
-- shift
--elif test "X[$]1" = X--fallback-echo; then
-- # Avoid inline document here, it may be left over
-- :
--elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then
-- # Yippee, $echo works!
-- :
--else
-- # Restart under the correct shell.
-- exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
--fi
-
--if test "X[$]1" = X--fallback-echo; then
-- # used as fallback echo
-- shift
-- cat <<EOF
--[$]*
--EOF
-- exit 0
--fi
-+# _LT_CONFIG_STATUS_DECLARE([VARNAME])
-+# ------------------------------------
-+# Quote a variable value, and forward it to `config.status' so that its
-+# declaration there will have the same value as in `configure'. VARNAME
-+# must have a single quote delimited value for this to work.
-+m4_define([_LT_CONFIG_STATUS_DECLARE],
-+[$1='`$ECHO "X$][$1" | $Xsed -e "$delay_single_quote_subst"`'])
-
--# The HP-UX ksh and POSIX shell print the target directory to stdout
--# if CDPATH is set.
--(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
--if test -z "$ECHO"; then
--if test "X${echo_test_string+set}" != Xset; then
--# find a string as large as possible, as long as the shell can cope with it
-- for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
-- # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
-- if (echo_test_string=`eval $cmd`) 2>/dev/null &&
-- echo_test_string=`eval $cmd` &&
-- (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
-- then
-- break
-- fi
-- done
--fi
-+# _LT_CONFIG_STATUS_DECLARATIONS
-+# ------------------------------
-+# We delimit libtool config variables with single quotes, so when
-+# we write them to config.status, we have to be sure to quote all
-+# embedded single quotes properly. In configure, this macro expands
-+# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
-+#
-+# <var>='`$ECHO "X$<var>" | $Xsed -e "$delay_single_quote_subst"`'
-+m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
-+[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
-+ [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
-
--if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
-- echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
-- test "X$echo_testing_string" = "X$echo_test_string"; then
-- :
--else
-- # The Solaris, AIX, and Digital Unix default echo programs unquote
-- # backslashes. This makes it impossible to quote backslashes using
-- # echo "$something" | sed 's/\\/\\\\/g'
-- #
-- # So, first we look for a working echo in the user's PATH.
-
-- lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-- for dir in $PATH /usr/ucb; do
-- IFS="$lt_save_ifs"
-- if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
-- test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
-- echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
-- test "X$echo_testing_string" = "X$echo_test_string"; then
-- echo="$dir/echo"
-- break
-- fi
-- done
-- IFS="$lt_save_ifs"
-+# _LT_LIBTOOL_TAGS
-+# ----------------
-+# Output comment and list of tags supported by the script
-+m4_defun([_LT_LIBTOOL_TAGS],
-+[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
-+available_tags="_LT_TAGS"dnl
-+])
-
-- if test "X$echo" = Xecho; then
-- # We didn't find a better echo, so look for alternatives.
-- if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
-- echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
-- test "X$echo_testing_string" = "X$echo_test_string"; then
-- # This shell has a builtin print -r that does the trick.
-- echo='print -r'
-- elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
-- test "X$CONFIG_SHELL" != X/bin/ksh; then
-- # If we have ksh, try running configure again with it.
-- ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
-- export ORIGINAL_CONFIG_SHELL
-- CONFIG_SHELL=/bin/ksh
-- export CONFIG_SHELL
-- exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
-- else
-- # Try using printf.
-- echo='printf %s\n'
-- if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
-- echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
-- test "X$echo_testing_string" = "X$echo_test_string"; then
-- # Cool, printf works
-- :
-- elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
-- test "X$echo_testing_string" = 'X\t' &&
-- echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
-- test "X$echo_testing_string" = "X$echo_test_string"; then
-- CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
-- export CONFIG_SHELL
-- SHELL="$CONFIG_SHELL"
-- export SHELL
-- echo="$CONFIG_SHELL [$]0 --fallback-echo"
-- elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
-- test "X$echo_testing_string" = 'X\t' &&
-- echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
-- test "X$echo_testing_string" = "X$echo_test_string"; then
-- echo="$CONFIG_SHELL [$]0 --fallback-echo"
-- else
-- # maybe with a smaller string...
-- prev=:
-
-- for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
-- if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
-- then
-- break
-- fi
-- prev="$cmd"
-- done
-+# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
-+# -----------------------------------
-+# Extract the dictionary values for VARNAME (optionally with TAG) and
-+# expand to a commented shell variable setting:
-+#
-+# # Some comment about what VAR is for.
-+# visible_name=$lt_internal_name
-+m4_define([_LT_LIBTOOL_DECLARE],
-+[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
-+ [description])))[]dnl
-+m4_pushdef([_libtool_name],
-+ m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
-+m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
-+ [0], [_libtool_name=[$]$1],
-+ [1], [_libtool_name=$lt_[]$1],
-+ [2], [_libtool_name=$lt_[]$1],
-+ [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
-+m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
-+])
-
-- if test "$prev" != 'sed 50q "[$]0"'; then
-- echo_test_string=`eval $prev`
-- export echo_test_string
-- exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
-- else
-- # Oops. We lost completely, so just stick with echo.
-- echo=echo
-- fi
-- fi
-- fi
-- fi
--fi
--fi
-
--# Copy echo and quote the copy suitably for passing to libtool from
--# the Makefile, instead of quoting the original, which is used later.
--ECHO=$echo
--if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
-- ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
--fi
-+# _LT_LIBTOOL_CONFIG_VARS
-+# -----------------------
-+# Produce commented declarations of non-tagged libtool config variables
-+# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
-+# script. Tagged libtool config variables (even for the LIBTOOL CONFIG
-+# section) are produced by _LT_LIBTOOL_TAG_VARS.
-+m4_defun([_LT_LIBTOOL_CONFIG_VARS],
-+[m4_foreach([_lt_var],
-+ m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
-+ [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
-
--AC_SUBST(ECHO)
--])])# _LT_AC_PROG_ECHO_BACKSLASH
-
-+# _LT_LIBTOOL_TAG_VARS(TAG)
-+# -------------------------
-+m4_define([_LT_LIBTOOL_TAG_VARS],
-+[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
-+ [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
-
--# _LT_AC_LOCK
--# -----------
--AC_DEFUN([_LT_AC_LOCK],
--[AC_ARG_ENABLE([libtool-lock],
-- [AC_HELP_STRING([--disable-libtool-lock],
-- [avoid locking (might break parallel builds)])])
--test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
--# Some flags need to be propagated to the compiler or linker for good
--# libtool support.
--case $host in
--ia64-*-hpux*)
-- # Find out which ABI we are using.
-- echo 'int i;' > conftest.$ac_ext
-- if AC_TRY_EVAL(ac_compile); then
-- case `/usr/bin/file conftest.$ac_objext` in
-- *ELF-32*)
-- HPUX_IA64_MODE="32"
-- ;;
-- *ELF-64*)
-- HPUX_IA64_MODE="64"
-- ;;
-- esac
-- fi
-- rm -rf conftest*
-- ;;
--*-*-irix6*)
-- # Find out which ABI we are using.
-- echo '[#]line __oline__ "configure"' > conftest.$ac_ext
-- if AC_TRY_EVAL(ac_compile); then
-- if test "$lt_cv_prog_gnu_ld" = yes; then
-- case `/usr/bin/file conftest.$ac_objext` in
-- *32-bit*)
-- LD="${LD-ld} -melf32bsmip"
-- ;;
-- *N32*)
-- LD="${LD-ld} -melf32bmipn32"
-+# _LT_TAGVAR(VARNAME, [TAGNAME])
-+# ------------------------------
-+m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
-+
-+
-+# _LT_CONFIG_COMMANDS
-+# -------------------
-+# Send accumulated output to $CONFIG_STATUS. Thanks to the lists of
-+# variables for single and double quote escaping we saved from calls
-+# to _LT_DECL, we can put quote escaped variables declarations
-+# into `config.status', and then the shell code to quote escape them in
-+# for loops in `config.status'. Finally, any additional code accumulated
-+# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
-+m4_defun([_LT_CONFIG_COMMANDS],
-+[AC_PROVIDE_IFELSE([LT_OUTPUT],
-+ dnl If the libtool generation code has been placed in $CONFIG_LT,
-+ dnl instead of duplicating it all over again into config.status,
-+ dnl then we will have config.status run $CONFIG_LT later, so it
-+ dnl needs to know what name is stored there:
-+ [AC_CONFIG_COMMANDS([libtool],
-+ [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
-+ dnl If the libtool generation code is destined for config.status,
-+ dnl expand the accumulated commands and init code now:
-+ [AC_CONFIG_COMMANDS([libtool],
-+ [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
-+])#_LT_CONFIG_COMMANDS
-+
-+
-+# Initialize.
-+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
-+[
-+
-+# The HP-UX ksh and POSIX shell print the target directory to stdout
-+# if CDPATH is set.
-+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-+
-+sed_quote_subst='$sed_quote_subst'
-+double_quote_subst='$double_quote_subst'
-+delay_variable_subst='$delay_variable_subst'
-+_LT_CONFIG_STATUS_DECLARATIONS
-+LTCC='$LTCC'
-+LTCFLAGS='$LTCFLAGS'
-+compiler='$compiler_DEFAULT'
-+
-+# Quote evaled strings.
-+for var in lt_decl_all_varnames([[ \
-+]], lt_decl_quote_varnames); do
-+ case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
-+ *[[\\\\\\\`\\"\\\$]]*)
-+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
- ;;
-- *64-bit*)
-- LD="${LD-ld} -melf64bmip"
-+ *)
-+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
- ;;
- esac
-- else
-- case `/usr/bin/file conftest.$ac_objext` in
-- *32-bit*)
-- LD="${LD-ld} -32"
-- ;;
-- *N32*)
-- LD="${LD-ld} -n32"
-+done
-+
-+# Double-quote double-evaled strings.
-+for var in lt_decl_all_varnames([[ \
-+]], lt_decl_dquote_varnames); do
-+ case \`eval \\\\\$ECHO "X\\\\\$\$var"\` in
-+ *[[\\\\\\\`\\"\\\$]]*)
-+ eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"X\\\$\$var\\" | \\\$Xsed -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
- ;;
-- *64-bit*)
-- LD="${LD-ld} -64"
-+ *)
-+ eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
- ;;
- esac
-- fi
-- fi
-- rm -rf conftest*
-- ;;
--
--x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*|s390*-*linux*|sparc*-*linux*)
-- # Find out which ABI we are using.
-- echo 'int i;' > conftest.$ac_ext
-- if AC_TRY_EVAL(ac_compile); then
-- case `/usr/bin/file conftest.o` in
-- *32-bit*)
-- case $host in
-- x86_64-*linux*)
-- LD="${LD-ld} -m elf_i386"
-- ;;
-- ppc64-*linux*|powerpc64-*linux*)
-- LD="${LD-ld} -m elf32ppclinux"
-- ;;
-- s390x-*linux*)
-- LD="${LD-ld} -m elf_s390"
-- ;;
-- sparc64-*linux*)
-- LD="${LD-ld} -m elf32_sparc"
-- ;;
-- esac
-- ;;
-- *64-bit*)
-- case $host in
-- x86_64-*linux*)
-- LD="${LD-ld} -m elf_x86_64"
-- ;;
-- ppc*-*linux*|powerpc*-*linux*)
-- LD="${LD-ld} -m elf64ppc"
-- ;;
-- s390*-*linux*)
-- LD="${LD-ld} -m elf64_s390"
-- ;;
-- sparc*-*linux*)
-- LD="${LD-ld} -m elf64_sparc"
-- ;;
-- esac
-- ;;
-- esac
-- fi
-- rm -rf conftest*
-- ;;
--
--*-*-sco3.2v5*)
-- # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-- SAVE_CFLAGS="$CFLAGS"
-- CFLAGS="$CFLAGS -belf"
-- AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
-- [AC_LANG_PUSH(C)
-- AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
-- AC_LANG_POP])
-- if test x"$lt_cv_cc_needs_belf" != x"yes"; then
-- # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-- CFLAGS="$SAVE_CFLAGS"
-- fi
-- ;;
--sparc*-*solaris*)
-- # Find out which ABI we are using.
-- echo 'int i;' > conftest.$ac_ext
-- if AC_TRY_EVAL(ac_compile); then
-- case `/usr/bin/file conftest.o` in
-- *64-bit*)
-- case $lt_cv_prog_gnu_ld in
-- yes*) LD="${LD-ld} -m elf64_sparc" ;;
-- *) LD="${LD-ld} -64" ;;
-- esac
-- ;;
-- esac
-- fi
-- rm -rf conftest*
-- ;;
-+done
-
--AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
--[*-*-cygwin* | *-*-mingw* | *-*-pw32*)
-- AC_CHECK_TOOL(DLLTOOL, dlltool, false)
-- AC_CHECK_TOOL(AS, as, false)
-- AC_CHECK_TOOL(OBJDUMP, objdump, false)
-+# Fix-up fallback echo if it was mangled by the above quoting rules.
-+case \$lt_ECHO in
-+*'\\\[$]0 --fallback-echo"')dnl "
-+ lt_ECHO=\`\$ECHO "X\$lt_ECHO" | \$Xsed -e 's/\\\\\\\\\\\\\\\[$]0 --fallback-echo"\[$]/\[$]0 --fallback-echo"/'\`
- ;;
-- ])
- esac
-
--need_locks="$enable_libtool_lock"
-+_LT_OUTPUT_LIBTOOL_INIT
-+])
-
--])# _LT_AC_LOCK
-
-+# LT_OUTPUT
-+# ---------
-+# This macro allows early generation of the libtool script (before
-+# AC_OUTPUT is called), incase it is used in configure for compilation
-+# tests.
-+AC_DEFUN([LT_OUTPUT],
-+[: ${CONFIG_LT=./config.lt}
-+AC_MSG_NOTICE([creating $CONFIG_LT])
-+cat >"$CONFIG_LT" <<_LTEOF
-+#! $SHELL
-+# Generated by $as_me.
-+# Run this file to recreate a libtool stub with the current configuration.
-+
-+lt_cl_silent=false
-+SHELL=\${CONFIG_SHELL-$SHELL}
-+_LTEOF
-+
-+cat >>"$CONFIG_LT" <<\_LTEOF
-+AS_SHELL_SANITIZE
-+_AS_PREPARE
-
--# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
--# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
--# ----------------------------------------------------------------
--# Check whether the given compiler option works
--AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION],
--[AC_REQUIRE([LT_AC_PROG_SED])
--AC_CACHE_CHECK([$1], [$2],
-- [$2=no
-- ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
-- printf "$lt_simple_compile_test_code" > conftest.$ac_ext
-- lt_compiler_flag="$3"
-- # Insert the option either (1) after the last *FLAGS variable, or
-- # (2) before a word containing "conftest.", or (3) at the end.
-- # Note that $ac_compile itself does not contain backslashes and begins
-- # with a dollar sign (not a hyphen), so the echo should work correctly.
-- # The option is referenced via a variable to avoid confusing sed.
-- lt_compile=`echo "$ac_compile" | $SED \
-- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-- -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-- -e 's:$: $lt_compiler_flag:'`
-- (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
-- (eval "$lt_compile" 2>conftest.err)
-- ac_status=$?
-- cat conftest.err >&AS_MESSAGE_LOG_FD
-- echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
-- if (exit $ac_status) && test -s "$ac_outfile"; then
-- # The compiler can only warn and ignore the option if not recognized
-- # So say no if there are warnings other than the usual output.
-- $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
-- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-- if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
-- $2=yes
-- fi
-- fi
-- $rm conftest*
--])
-+exec AS_MESSAGE_FD>&1
-+exec AS_MESSAGE_LOG_FD>>config.log
-+{
-+ echo
-+ AS_BOX([Running $as_me.])
-+} >&AS_MESSAGE_LOG_FD
-+
-+lt_cl_help="\
-+\`$as_me' creates a local libtool stub from the current configuration,
-+for use in further configure time tests before the real libtool is
-+generated.
-+
-+Usage: $[0] [[OPTIONS]]
-+
-+ -h, --help print this help, then exit
-+ -V, --version print version number, then exit
-+ -q, --quiet do not print progress messages
-+ -d, --debug don't remove temporary files
-+
-+Report bugs to <bug-libtool@gnu.org>."
-+
-+lt_cl_version="\
-+m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
-+m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
-+configured by $[0], generated by m4_PACKAGE_STRING.
-+
-+Copyright (C) 2008 Free Software Foundation, Inc.
-+This config.lt script is free software; the Free Software Foundation
-+gives unlimited permision to copy, distribute and modify it."
-
--if test x"[$]$2" = xyes; then
-- ifelse([$5], , :, [$5])
--else
-- ifelse([$6], , :, [$6])
--fi
--])# AC_LIBTOOL_COMPILER_OPTION
-+while test $[#] != 0
-+do
-+ case $[1] in
-+ --version | --v* | -V )
-+ echo "$lt_cl_version"; exit 0 ;;
-+ --help | --h* | -h )
-+ echo "$lt_cl_help"; exit 0 ;;
-+ --debug | --d* | -d )
-+ debug=: ;;
-+ --quiet | --q* | --silent | --s* | -q )
-+ lt_cl_silent=: ;;
-
-+ -*) AC_MSG_ERROR([unrecognized option: $[1]
-+Try \`$[0] --help' for more information.]) ;;
-
--# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
--# [ACTION-SUCCESS], [ACTION-FAILURE])
--# ------------------------------------------------------------
--# Check whether the given compiler option works
--AC_DEFUN([AC_LIBTOOL_LINKER_OPTION],
--[AC_CACHE_CHECK([$1], [$2],
-- [$2=no
-- save_LDFLAGS="$LDFLAGS"
-- LDFLAGS="$LDFLAGS $3"
-- printf "$lt_simple_link_test_code" > conftest.$ac_ext
-- if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
-- # The linker can only warn and ignore the option if not recognized
-- # So say no if there are warnings
-- if test -s conftest.err; then
-- # Append any errors to the config.log.
-- cat conftest.err 1>&AS_MESSAGE_LOG_FD
-- $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
-- $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
-- if diff conftest.exp conftest.er2 >/dev/null; then
-- $2=yes
-- fi
-- else
-- $2=yes
-- fi
-- fi
-- $rm conftest*
-- LDFLAGS="$save_LDFLAGS"
--])
-+ *) AC_MSG_ERROR([unrecognized argument: $[1]
-+Try \`$[0] --help' for more information.]) ;;
-+ esac
-+ shift
-+done
-
--if test x"[$]$2" = xyes; then
-- ifelse([$4], , :, [$4])
--else
-- ifelse([$5], , :, [$5])
-+if $lt_cl_silent; then
-+ exec AS_MESSAGE_FD>/dev/null
- fi
--])# AC_LIBTOOL_LINKER_OPTION
-+_LTEOF
-
-+cat >>"$CONFIG_LT" <<_LTEOF
-+_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
-+_LTEOF
-+
-+cat >>"$CONFIG_LT" <<\_LTEOF
-+AC_MSG_NOTICE([creating $ofile])
-+_LT_OUTPUT_LIBTOOL_COMMANDS
-+AS_EXIT(0)
-+_LTEOF
-+chmod +x "$CONFIG_LT"
-+
-+# configure is writing to config.log, but config.lt does its own redirection,
-+# appending to config.log, which fails on DOS, as config.log is still kept
-+# open by configure. Here we exec the FD to /dev/null, effectively closing
-+# config.log, so it can be properly (re)opened and appended to by config.lt.
-+if test "$no_create" != yes; then
-+ lt_cl_success=:
-+ test "$silent" = yes &&
-+ lt_config_lt_args="$lt_config_lt_args --quiet"
-+ exec AS_MESSAGE_LOG_FD>/dev/null
-+ $SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
-+ exec AS_MESSAGE_LOG_FD>>config.log
-+ $lt_cl_success || AS_EXIT(1)
-+fi
-+])# LT_OUTPUT
-
--# AC_LIBTOOL_SYS_MAX_CMD_LEN
--# --------------------------
--AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN],
--[# find the maximum length of command line arguments
--AC_MSG_CHECKING([the maximum length of command line arguments])
--AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
-- i=0
-- teststring="ABCD"
-
-- case $build_os in
-- msdosdjgpp*)
-- # On DJGPP, this test can blow up pretty badly due to problems in libc
-- # (any single argument exceeding 2000 bytes causes a buffer overrun
-- # during glob expansion). Even if it were fixed, the result of this
-- # check would be larger than it should be.
-- lt_cv_sys_max_cmd_len=12288; # 12K is about right
-- ;;
-+# _LT_CONFIG(TAG)
-+# ---------------
-+# If TAG is the built-in tag, create an initial libtool script with a
-+# default configuration from the untagged config vars. Otherwise add code
-+# to config.status for appending the configuration named by TAG from the
-+# matching tagged config vars.
-+m4_defun([_LT_CONFIG],
-+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
-+_LT_CONFIG_SAVE_COMMANDS([
-+ m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
-+ m4_if(_LT_TAG, [C], [
-+ # See if we are running on zsh, and set the options which allow our
-+ # commands through without removal of \ escapes.
-+ if test -n "${ZSH_VERSION+set}" ; then
-+ setopt NO_GLOB_SUBST
-+ fi
-
-- gnu*)
-- # Under GNU Hurd, this test is not required because there is
-- # no limit to the length of command line arguments.
-- # Libtool will interpret -1 as no limit whatsoever
-- lt_cv_sys_max_cmd_len=-1;
-- ;;
-+ cfgfile="${ofile}T"
-+ trap "$RM \"$cfgfile\"; exit 1" 1 2 15
-+ $RM "$cfgfile"
-
-- cygwin* | mingw*)
-- # On Win9x/ME, this test blows up -- it succeeds, but takes
-- # about 5 minutes as the teststring grows exponentially.
-- # Worse, since 9x/ME are not pre-emptively multitasking,
-- # you end up with a "frozen" computer, even though with patience
-- # the test eventually succeeds (with a max line length of 256k).
-- # Instead, let's just punt: use the minimum linelength reported by
-- # all of the supported platforms: 8192 (on NT/2K/XP).
-- lt_cv_sys_max_cmd_len=8192;
-- ;;
-+ cat <<_LT_EOF >> "$cfgfile"
-+#! $SHELL
-
-- amigaos*)
-- # On AmigaOS with pdksh, this test takes hours, literally.
-- # So we just punt and use a minimum line length of 8192.
-- lt_cv_sys_max_cmd_len=8192;
-- ;;
-+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
-+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
-+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
-+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
-+#
-+_LT_COPYING
-+_LT_LIBTOOL_TAGS
-
-- netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
-- # This has been around since 386BSD, at least. Likely further.
-- if test -x /sbin/sysctl; then
-- lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
-- elif test -x /usr/sbin/sysctl; then
-- lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
-- else
-- lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs
-- fi
-- # And add a safety zone
-- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
-- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
-- ;;
-+# ### BEGIN LIBTOOL CONFIG
-+_LT_LIBTOOL_CONFIG_VARS
-+_LT_LIBTOOL_TAG_VARS
-+# ### END LIBTOOL CONFIG
-
-- interix*)
-- # We know the value 262144 and hardcode it with a safety zone (like BSD)
-- lt_cv_sys_max_cmd_len=196608
-- ;;
-+_LT_EOF
-
-- osf*)
-- # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
-- # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
-- # nice to cause kernel panics so lets avoid the loop below.
-- # First set a reasonable default.
-- lt_cv_sys_max_cmd_len=16384
-- #
-- if test -x /sbin/sysconfig; then
-- case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
-- *1*) lt_cv_sys_max_cmd_len=-1 ;;
-- esac
-- fi
-- ;;
-- sco3.2v5*)
-- lt_cv_sys_max_cmd_len=102400
-- ;;
-- sysv5* | sco5v6* | sysv4.2uw2*)
-- kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
-- if test -n "$kargmax"; then
-- lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'`
-- else
-- lt_cv_sys_max_cmd_len=32768
-- fi
-- ;;
-- *)
-- # If test is not a shell built-in, we'll probably end up computing a
-- # maximum length that is only half of the actual maximum length, but
-- # we can't tell.
-- SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
-- while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \
-- = "XX$teststring") >/dev/null 2>&1 &&
-- new_result=`expr "X$teststring" : ".*" 2>&1` &&
-- lt_cv_sys_max_cmd_len=$new_result &&
-- test $i != 17 # 1/2 MB should be enough
-- do
-- i=`expr $i + 1`
-- teststring=$teststring$teststring
-- done
-- teststring=
-- # Add a significant safety factor because C++ compilers can tack on massive
-- # amounts of additional arguments before passing them to the linker.
-- # It appears as though 1/2 is a usable value.
-- lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
-+ case $host_os in
-+ aix3*)
-+ cat <<\_LT_EOF >> "$cfgfile"
-+# AIX sometimes has problems with the GCC collect2 program. For some
-+# reason, if we set the COLLECT_NAMES environment variable, the problems
-+# vanish in a puff of smoke.
-+if test "X${COLLECT_NAMES+set}" != Xset; then
-+ COLLECT_NAMES=
-+ export COLLECT_NAMES
-+fi
-+_LT_EOF
- ;;
- esac
--])
--if test -n $lt_cv_sys_max_cmd_len ; then
-- AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
--else
-- AC_MSG_RESULT(none)
--fi
--])# AC_LIBTOOL_SYS_MAX_CMD_LEN
-+
-+ _LT_PROG_LTMAIN
-+
-+ # We use sed instead of cat because bash on DJGPP gets confused if
-+ # if finds mixed CR/LF and LF-only lines. Since sed operates in
-+ # text mode, it properly converts lines to CR/LF. This bash problem
-+ # is reportedly fixed, but why not run on old versions too?
-+ sed '/^# Generated shell functions inserted here/q' "$ltmain" >> "$cfgfile" \
-+ || (rm -f "$cfgfile"; exit 1)
-+
-+ _LT_PROG_XSI_SHELLFNS
-+
-+ sed -n '/^# Generated shell functions inserted here/,$p' "$ltmain" >> "$cfgfile" \
-+ || (rm -f "$cfgfile"; exit 1)
-+
-+ mv -f "$cfgfile" "$ofile" ||
-+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
-+ chmod +x "$ofile"
-+],
-+[cat <<_LT_EOF >> "$ofile"
-+
-+dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
-+dnl in a comment (ie after a #).
-+# ### BEGIN LIBTOOL TAG CONFIG: $1
-+_LT_LIBTOOL_TAG_VARS(_LT_TAG)
-+# ### END LIBTOOL TAG CONFIG: $1
-+_LT_EOF
-+])dnl /m4_if
-+],
-+[m4_if([$1], [], [
-+ PACKAGE='$PACKAGE'
-+ VERSION='$VERSION'
-+ TIMESTAMP='$TIMESTAMP'
-+ RM='$RM'
-+ ofile='$ofile'], [])
-+])dnl /_LT_CONFIG_SAVE_COMMANDS
-+])# _LT_CONFIG
-+
-+
-+# LT_SUPPORTED_TAG(TAG)
-+# ---------------------
-+# Trace this macro to discover what tags are supported by the libtool
-+# --tag option, using:
-+# autoconf --trace 'LT_SUPPORTED_TAG:$1'
-+AC_DEFUN([LT_SUPPORTED_TAG], [])
-+
-+
-+# C support is built-in for now
-+m4_define([_LT_LANG_C_enabled], [])
-+m4_define([_LT_TAGS], [])
-+
-+
-+# LT_LANG(LANG)
-+# -------------
-+# Enable libtool support for the given language if not already enabled.
-+AC_DEFUN([LT_LANG],
-+[AC_BEFORE([$0], [LT_OUTPUT])dnl
-+m4_case([$1],
-+ [C], [_LT_LANG(C)],
-+ [C++], [_LT_LANG(CXX)],
-+ [Java], [_LT_LANG(GCJ)],
-+ [Fortran 77], [_LT_LANG(F77)],
-+ [Fortran], [_LT_LANG(FC)],
-+ [Windows Resource], [_LT_LANG(RC)],
-+ [m4_ifdef([_LT_LANG_]$1[_CONFIG],
-+ [_LT_LANG($1)],
-+ [m4_fatal([$0: unsupported language: "$1"])])])dnl
-+])# LT_LANG
-
-
--# _LT_AC_CHECK_DLFCN
-+# _LT_LANG(LANGNAME)
- # ------------------
--AC_DEFUN([_LT_AC_CHECK_DLFCN],
--[AC_CHECK_HEADERS(dlfcn.h)dnl
--])# _LT_AC_CHECK_DLFCN
-+m4_defun([_LT_LANG],
-+[m4_ifdef([_LT_LANG_]$1[_enabled], [],
-+ [LT_SUPPORTED_TAG([$1])dnl
-+ m4_append([_LT_TAGS], [$1 ])dnl
-+ m4_define([_LT_LANG_]$1[_enabled], [])dnl
-+ _LT_LANG_$1_CONFIG($1)])dnl
-+])# _LT_LANG
-
-
--# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
--# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
--# ---------------------------------------------------------------------
--AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF],
--[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
--if test "$cross_compiling" = yes; then :
-- [$4]
--else
-- lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
-- lt_status=$lt_dlunknown
-- cat > conftest.$ac_ext <<EOF
--[#line __oline__ "configure"
--#include "confdefs.h"
-+# _LT_LANG_DEFAULT_CONFIG
-+# -----------------------
-+m4_defun([_LT_LANG_DEFAULT_CONFIG],
-+[AC_PROVIDE_IFELSE([AC_PROG_CXX],
-+ [LT_LANG(CXX)],
-+ [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
-+
-+AC_PROVIDE_IFELSE([AC_PROG_F77],
-+ [LT_LANG(F77)],
-+ [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
-+
-+AC_PROVIDE_IFELSE([AC_PROG_FC],
-+ [LT_LANG(FC)],
-+ [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
-+
-+dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
-+dnl pulling things in needlessly.
-+AC_PROVIDE_IFELSE([AC_PROG_GCJ],
-+ [LT_LANG(GCJ)],
-+ [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
-+ [LT_LANG(GCJ)],
-+ [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
-+ [LT_LANG(GCJ)],
-+ [m4_ifdef([AC_PROG_GCJ],
-+ [m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
-+ m4_ifdef([A][M_PROG_GCJ],
-+ [m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
-+ m4_ifdef([LT_PROG_GCJ],
-+ [m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
-+
-+AC_PROVIDE_IFELSE([LT_PROG_RC],
-+ [LT_LANG(RC)],
-+ [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
-+])# _LT_LANG_DEFAULT_CONFIG
-+
-+# Obsolete macros:
-+AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
-+AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
-+AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
-+AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
-+dnl aclocal-1.4 backwards compatibility:
-+dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
-+dnl AC_DEFUN([AC_LIBTOOL_F77], [])
-+dnl AC_DEFUN([AC_LIBTOOL_FC], [])
-+dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
-
--#if HAVE_DLFCN_H
--#include <dlfcn.h>
--#endif
-
--#include <stdio.h>
-+# _LT_TAG_COMPILER
-+# ----------------
-+m4_defun([_LT_TAG_COMPILER],
-+[AC_REQUIRE([AC_PROG_CC])dnl
-
--#ifdef RTLD_GLOBAL
--# define LT_DLGLOBAL RTLD_GLOBAL
--#else
--# ifdef DL_GLOBAL
--# define LT_DLGLOBAL DL_GLOBAL
--# else
--# define LT_DLGLOBAL 0
--# endif
--#endif
-+_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
-+_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
-+_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
-+_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
-
--/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
-- find out it does not work in some platform. */
--#ifndef LT_DLLAZY_OR_NOW
--# ifdef RTLD_LAZY
--# define LT_DLLAZY_OR_NOW RTLD_LAZY
--# else
--# ifdef DL_LAZY
--# define LT_DLLAZY_OR_NOW DL_LAZY
--# else
--# ifdef RTLD_NOW
--# define LT_DLLAZY_OR_NOW RTLD_NOW
--# else
--# ifdef DL_NOW
--# define LT_DLLAZY_OR_NOW DL_NOW
--# else
--# define LT_DLLAZY_OR_NOW 0
--# endif
--# endif
--# endif
--# endif
--#endif
-+# If no C compiler was specified, use CC.
-+LTCC=${LTCC-"$CC"}
-
--#ifdef __cplusplus
--extern "C" void exit (int);
--#endif
-+# If no C compiler flags were specified, use CFLAGS.
-+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
-
--void fnord() { int i=42;}
--int main ()
--{
-- void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
-- int status = $lt_dlunknown;
-+# Allow CC to be a program name with arguments.
-+compiler=$CC
-+])# _LT_TAG_COMPILER
-
-- if (self)
-- {
-- if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
-- else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
-- /* dlclose (self); */
-- }
-- else
-- puts (dlerror ());
-
-- exit (status);
--}]
--EOF
-- if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
-- (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
-- lt_status=$?
-- case x$lt_status in
-- x$lt_dlno_uscore) $1 ;;
-- x$lt_dlneed_uscore) $2 ;;
-- x$lt_dlunknown|x*) $3 ;;
-- esac
-- else :
-- # compilation failed
-- $3
-- fi
--fi
--rm -fr conftest*
--])# _LT_AC_TRY_DLOPEN_SELF
-+# _LT_COMPILER_BOILERPLATE
-+# ------------------------
-+# Check for compiler boilerplate output or warnings with
-+# the simple compiler test code.
-+m4_defun([_LT_COMPILER_BOILERPLATE],
-+[m4_require([_LT_DECL_SED])dnl
-+ac_outfile=conftest.$ac_objext
-+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
-+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-+_lt_compiler_boilerplate=`cat conftest.err`
-+$RM conftest*
-+])# _LT_COMPILER_BOILERPLATE
-
-
--# AC_LIBTOOL_DLOPEN_SELF
-+# _LT_LINKER_BOILERPLATE
- # ----------------------
--AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF],
--[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
--if test "x$enable_dlopen" != xyes; then
-- enable_dlopen=unknown
-- enable_dlopen_self=unknown
-- enable_dlopen_self_static=unknown
--else
-- lt_cv_dlopen=no
-- lt_cv_dlopen_libs=
-+# Check for linker boilerplate output or warnings with
-+# the simple link test code.
-+m4_defun([_LT_LINKER_BOILERPLATE],
-+[m4_require([_LT_DECL_SED])dnl
-+ac_outfile=conftest.$ac_objext
-+echo "$lt_simple_link_test_code" >conftest.$ac_ext
-+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
-+_lt_linker_boilerplate=`cat conftest.err`
-+$RM -r conftest*
-+])# _LT_LINKER_BOILERPLATE
-
-+# _LT_REQUIRED_DARWIN_CHECKS
-+# -------------------------
-+m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
- case $host_os in
-- beos*)
-- lt_cv_dlopen="load_add_on"
-- lt_cv_dlopen_libs=
-- lt_cv_dlopen_self=yes
-- ;;
--
-- mingw* | pw32*)
-- lt_cv_dlopen="LoadLibrary"
-- lt_cv_dlopen_libs=
-- ;;
--
-- cygwin*)
-- lt_cv_dlopen="dlopen"
-- lt_cv_dlopen_libs=
-- ;;
--
-- darwin*)
-- # if libdl is installed we need to link against it
-- AC_CHECK_LIB([dl], [dlopen],
-- [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
-- lt_cv_dlopen="dyld"
-- lt_cv_dlopen_libs=
-- lt_cv_dlopen_self=yes
-+ rhapsody* | darwin*)
-+ AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
-+ AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
-+ AC_CHECK_TOOL([LIPO], [lipo], [:])
-+ AC_CHECK_TOOL([OTOOL], [otool], [:])
-+ AC_CHECK_TOOL([OTOOL64], [otool64], [:])
-+ _LT_DECL([], [DSYMUTIL], [1],
-+ [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
-+ _LT_DECL([], [NMEDIT], [1],
-+ [Tool to change global to local symbols on Mac OS X])
-+ _LT_DECL([], [LIPO], [1],
-+ [Tool to manipulate fat objects and archives on Mac OS X])
-+ _LT_DECL([], [OTOOL], [1],
-+ [ldd/readelf like tool for Mach-O binaries on Mac OS X])
-+ _LT_DECL([], [OTOOL64], [1],
-+ [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
-+
-+ AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
-+ [lt_cv_apple_cc_single_mod=no
-+ if test -z "${LT_MULTI_MODULE}"; then
-+ # By default we will add the -single_module flag. You can override
-+ # by either setting the environment variable LT_MULTI_MODULE
-+ # non-empty at configure time, or by adding -multi_module to the
-+ # link flags.
-+ rm -rf libconftest.dylib*
-+ echo "int foo(void){return 1;}" > conftest.c
-+ echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-+-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
-+ $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-+ -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
-+ _lt_result=$?
-+ if test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then
-+ lt_cv_apple_cc_single_mod=yes
-+ else
-+ cat conftest.err >&AS_MESSAGE_LOG_FD
-+ fi
-+ rm -rf libconftest.dylib*
-+ rm -f conftest.*
-+ fi])
-+ AC_CACHE_CHECK([for -exported_symbols_list linker flag],
-+ [lt_cv_ld_exported_symbols_list],
-+ [lt_cv_ld_exported_symbols_list=no
-+ save_LDFLAGS=$LDFLAGS
-+ echo "_main" > conftest.sym
-+ LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
-+ AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
-+ [lt_cv_ld_exported_symbols_list=yes],
-+ [lt_cv_ld_exported_symbols_list=no])
-+ LDFLAGS="$save_LDFLAGS"
- ])
-- ;;
--
-- *)
-- AC_CHECK_FUNC([shl_load],
-- [lt_cv_dlopen="shl_load"],
-- [AC_CHECK_LIB([dld], [shl_load],
-- [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"],
-- [AC_CHECK_FUNC([dlopen],
-- [lt_cv_dlopen="dlopen"],
-- [AC_CHECK_LIB([dl], [dlopen],
-- [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
-- [AC_CHECK_LIB([svld], [dlopen],
-- [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
-- [AC_CHECK_LIB([dld], [dld_link],
-- [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"])
-- ])
-- ])
-- ])
-- ])
-- ])
-+ case $host_os in
-+ rhapsody* | darwin1.[[012]])
-+ _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
-+ darwin1.*)
-+ _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-+ darwin*) # darwin 5.x on
-+ # if running on 10.5 or later, the deployment target defaults
-+ # to the OS version, if on x86, and 10.4, the deployment
-+ # target defaults to 10.4. Don't you love it?
-+ case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
-+ 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
-+ _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-+ 10.[[012]]*)
-+ _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
-+ 10.*)
-+ _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
-+ esac
-+ ;;
-+ esac
-+ if test "$lt_cv_apple_cc_single_mod" = "yes"; then
-+ _lt_dar_single_mod='$single_module'
-+ fi
-+ if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
-+ _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
-+ else
-+ _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
-+ fi
-+ if test "$DSYMUTIL" != ":"; then
-+ _lt_dsymutil='~$DSYMUTIL $lib || :'
-+ else
-+ _lt_dsymutil=
-+ fi
- ;;
- esac
-+])
-
-- if test "x$lt_cv_dlopen" != xno; then
-- enable_dlopen=yes
-+
-+# _LT_DARWIN_LINKER_FEATURES
-+# --------------------------
-+# Checks for linker and compiler features on darwin
-+m4_defun([_LT_DARWIN_LINKER_FEATURES],
-+[
-+ m4_require([_LT_REQUIRED_DARWIN_CHECKS])
-+ _LT_TAGVAR(archive_cmds_need_lc, $1)=no
-+ _LT_TAGVAR(hardcode_direct, $1)=no
-+ _LT_TAGVAR(hardcode_automatic, $1)=yes
-+ _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
-+ _LT_TAGVAR(whole_archive_flag_spec, $1)=''
-+ _LT_TAGVAR(link_all_deplibs, $1)=yes
-+ _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
-+ case $cc_basename in
-+ ifort*) _lt_dar_can_shared=yes ;;
-+ *) _lt_dar_can_shared=$GCC ;;
-+ esac
-+ if test "$_lt_dar_can_shared" = "yes"; then
-+ output_verbose_link_cmd=echo
-+ _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
-+ _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
-+ _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
-+ _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
-+ m4_if([$1], [CXX],
-+[ if test "$lt_cv_apple_cc_single_mod" != "yes"; then
-+ _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
-+ _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
-+ fi
-+],[])
- else
-- enable_dlopen=no
-+ _LT_TAGVAR(ld_shlibs, $1)=no
- fi
-+])
-
-- case $lt_cv_dlopen in
-- dlopen)
-- save_CPPFLAGS="$CPPFLAGS"
-- test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
--
-- save_LDFLAGS="$LDFLAGS"
-- wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
-+# _LT_SYS_MODULE_PATH_AIX
-+# -----------------------
-+# Links a minimal program and checks the executable
-+# for the system default hardcoded library path. In most cases,
-+# this is /usr/lib:/lib, but when the MPI compilers are used
-+# the location of the communication and MPI libs are included too.
-+# If we don't find anything, use the default library path according
-+# to the aix ld manual.
-+m4_defun([_LT_SYS_MODULE_PATH_AIX],
-+[m4_require([_LT_DECL_SED])dnl
-+AC_LINK_IFELSE(AC_LANG_PROGRAM,[
-+lt_aix_libpath_sed='
-+ /Import File Strings/,/^$/ {
-+ /^0/ {
-+ s/^0 *\(.*\)$/\1/
-+ p
-+ }
-+ }'
-+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-+# Check for a 64-bit object if we didn't find anything.
-+if test -z "$aix_libpath"; then
-+ aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
-+fi],[])
-+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
-+])# _LT_SYS_MODULE_PATH_AIX
-
-- save_LIBS="$LIBS"
-- LIBS="$lt_cv_dlopen_libs $LIBS"
-
-- AC_CACHE_CHECK([whether a program can dlopen itself],
-- lt_cv_dlopen_self, [dnl
-- _LT_AC_TRY_DLOPEN_SELF(
-- lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
-- lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
-- ])
-+# _LT_SHELL_INIT(ARG)
-+# -------------------
-+m4_define([_LT_SHELL_INIT],
-+[ifdef([AC_DIVERSION_NOTICE],
-+ [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
-+ [AC_DIVERT_PUSH(NOTICE)])
-+$1
-+AC_DIVERT_POP
-+])# _LT_SHELL_INIT
-
-- if test "x$lt_cv_dlopen_self" = xyes; then
-- wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
-- AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
-- lt_cv_dlopen_self_static, [dnl
-- _LT_AC_TRY_DLOPEN_SELF(
-- lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
-- lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross)
-- ])
-- fi
-
-- CPPFLAGS="$save_CPPFLAGS"
-- LDFLAGS="$save_LDFLAGS"
-- LIBS="$save_LIBS"
-- ;;
-- esac
-+# _LT_PROG_ECHO_BACKSLASH
-+# -----------------------
-+# Add some code to the start of the generated configure script which
-+# will find an echo command which doesn't interpret backslashes.
-+m4_defun([_LT_PROG_ECHO_BACKSLASH],
-+[_LT_SHELL_INIT([
-+# Check that we are running under the correct shell.
-+SHELL=${CONFIG_SHELL-/bin/sh}
-
-- case $lt_cv_dlopen_self in
-- yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
-- *) enable_dlopen_self=unknown ;;
-- esac
-+case X$lt_ECHO in
-+X*--fallback-echo)
-+ # Remove one level of quotation (which was required for Make).
-+ ECHO=`echo "$lt_ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
-+ ;;
-+esac
-
-- case $lt_cv_dlopen_self_static in
-- yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
-- *) enable_dlopen_self_static=unknown ;;
-- esac
-+ECHO=${lt_ECHO-echo}
-+if test "X[$]1" = X--no-reexec; then
-+ # Discard the --no-reexec flag, and continue.
-+ shift
-+elif test "X[$]1" = X--fallback-echo; then
-+ # Avoid inline document here, it may be left over
-+ :
-+elif test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' ; then
-+ # Yippee, $ECHO works!
-+ :
-+else
-+ # Restart under the correct shell.
-+ exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
- fi
--])# AC_LIBTOOL_DLOPEN_SELF
--
-
--# AC_LIBTOOL_PROG_CC_C_O([TAGNAME])
--# ---------------------------------
--# Check to see if options -c and -o are simultaneously supported by compiler
--AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O],
--[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
--AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
-- [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
-- [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
-- $rm -r conftest 2>/dev/null
-- mkdir conftest
-- cd conftest
-- mkdir out
-- printf "$lt_simple_compile_test_code" > conftest.$ac_ext
-+if test "X[$]1" = X--fallback-echo; then
-+ # used as fallback echo
-+ shift
-+ cat <<_LT_EOF
-+[$]*
-+_LT_EOF
-+ exit 0
-+fi
-
-- lt_compiler_flag="-o out/conftest2.$ac_objext"
-- # Insert the option either (1) after the last *FLAGS variable, or
-- # (2) before a word containing "conftest.", or (3) at the end.
-- # Note that $ac_compile itself does not contain backslashes and begins
-- # with a dollar sign (not a hyphen), so the echo should work correctly.
-- lt_compile=`echo "$ac_compile" | $SED \
-- -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
-- -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
-- -e 's:$: $lt_compiler_flag:'`
-- (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
-- (eval "$lt_compile" 2>out/conftest.err)
-- ac_status=$?
-- cat out/conftest.err >&AS_MESSAGE_LOG_FD
-- echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
-- if (exit $ac_status) && test -s out/conftest2.$ac_objext
-- then
-- # The compiler can only warn and ignore the option if not recognized
-- # So say no if there are warnings
-- $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
-- $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
-- if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
-- _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
-- fi
-- fi
-- chmod u+w . 2>&AS_MESSAGE_LOG_FD
-- $rm conftest*
-- # SGI C++ compiler will create directory out/ii_files/ for
-- # template instantiation
-- test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
-- $rm out/* && rmdir out
-- cd ..
-- rmdir conftest
-- $rm conftest*
--])
--])# AC_LIBTOOL_PROG_CC_C_O
-+# The HP-UX ksh and POSIX shell print the target directory to stdout
-+# if CDPATH is set.
-+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
-
-+if test -z "$lt_ECHO"; then
-+ if test "X${echo_test_string+set}" != Xset; then
-+ # find a string as large as possible, as long as the shell can cope with it
-+ for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
-+ # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
-+ if { echo_test_string=`eval $cmd`; } 2>/dev/null &&
-+ { test "X$echo_test_string" = "X$echo_test_string"; } 2>/dev/null
-+ then
-+ break
-+ fi
-+ done
-+ fi
-
--# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME])
--# -----------------------------------------
--# Check to see if we can do hard links to lock some files if needed
--AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS],
--[AC_REQUIRE([_LT_AC_LOCK])dnl
-+ if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
-+ echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
-+ test "X$echo_testing_string" = "X$echo_test_string"; then
-+ :
-+ else
-+ # The Solaris, AIX, and Digital Unix default echo programs unquote
-+ # backslashes. This makes it impossible to quote backslashes using
-+ # echo "$something" | sed 's/\\/\\\\/g'
-+ #
-+ # So, first we look for a working echo in the user's PATH.
-
--hard_links="nottested"
--if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
-- # do not overwrite the value of need_locks provided by the user
-- AC_MSG_CHECKING([if we can lock with hard links])
-- hard_links=yes
-- $rm conftest*
-- ln conftest.a conftest.b 2>/dev/null && hard_links=no
-- touch conftest.a
-- ln conftest.a conftest.b 2>&5 || hard_links=no
-- ln conftest.a conftest.b 2>/dev/null && hard_links=no
-- AC_MSG_RESULT([$hard_links])
-- if test "$hard_links" = no; then
-- AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
-- need_locks=warn
-- fi
--else
-- need_locks=no
--fi
--])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS
--
--
--# AC_LIBTOOL_OBJDIR
--# -----------------
--AC_DEFUN([AC_LIBTOOL_OBJDIR],
--[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
--[rm -f .libs 2>/dev/null
--mkdir .libs 2>/dev/null
--if test -d .libs; then
-- lt_cv_objdir=.libs
--else
-- # MS-DOS does not allow filenames that begin with a dot.
-- lt_cv_objdir=_libs
--fi
--rmdir .libs 2>/dev/null])
--objdir=$lt_cv_objdir
--])# AC_LIBTOOL_OBJDIR
-+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
-+ for dir in $PATH /usr/ucb; do
-+ IFS="$lt_save_ifs"
-+ if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
-+ test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
-+ echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
-+ test "X$echo_testing_string" = "X$echo_test_string"; then
-+ ECHO="$dir/echo"
-+ break
-+ fi
-+ done
-+ IFS="$lt_save_ifs"
-
-+ if test "X$ECHO" = Xecho; then
-+ # We didn't find a better echo, so look for alternatives.
-+ if test "X`{ print -r '\t'; } 2>/dev/null`" = 'X\t' &&
-+ echo_testing_string=`{ print -r "$echo_test_string"; } 2>/dev/null` &&
-+ test "X$echo_testing_string" = "X$echo_test_string"; then
-+ # This shell has a builtin print -r that does the trick.
-+ ECHO='print -r'
-+ elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } &&
-+ test "X$CONFIG_SHELL" != X/bin/ksh; then
-+ # If we have ksh, try running configure again with it.
-+ ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
-+ export ORIGINAL_CONFIG_SHELL
-+ CONFIG_SHELL=/bin/ksh
-+ export CONFIG_SHELL
-+ exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
-+ else
-+ # Try using printf.
-+ ECHO='printf %s\n'
-+ if test "X`{ $ECHO '\t'; } 2>/dev/null`" = 'X\t' &&
-+ echo_testing_string=`{ $ECHO "$echo_test_string"; } 2>/dev/null` &&
-+ test "X$echo_testing_string" = "X$echo_test_string"; then
-+ # Cool, printf works
-+ :
-+ elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
-+ test "X$echo_testing_string" = 'X\t' &&
-+ echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
-+ test "X$echo_testing_string" = "X$echo_test_string"; then
-+ CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
-+ export CONFIG_SHELL
-+ SHELL="$CONFIG_SHELL"
-+ export SHELL
-+ ECHO="$CONFIG_SHELL [$]0 --fallback-echo"
-+ elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
-+ test "X$echo_testing_string" = 'X\t' &&
-+ echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
-+ test "X$echo_testing_string" = "X$echo_test_string"; then
-+ ECHO="$CONFIG_SHELL [$]0 --fallback-echo"
-+ else
-+ # maybe with a smaller string...
-+ prev=:
-
--# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME])
--# ----------------------------------------------
--# Check hardcoding attributes.
--AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH],
--[AC_MSG_CHECKING([how to hardcode library paths into programs])
--_LT_AC_TAGVAR(hardcode_action, $1)=
--if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \
-- test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \
-- test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
-+ for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
-+ if { test "X$echo_test_string" = "X`eval $cmd`"; } 2>/dev/null
-+ then
-+ break
-+ fi
-+ prev="$cmd"
-+ done
-
-- # We can hardcode non-existant directories.
-- if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no &&
-- # If the only mechanism to avoid hardcoding is shlibpath_var, we
-- # have to relink, otherwise we might link with an installed library
-- # when we should be linking with a yet-to-be-installed one
-- ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
-- test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then
-- # Linking always hardcodes the temporary library directory.
-- _LT_AC_TAGVAR(hardcode_action, $1)=relink
-- else
-- # We can link without hardcoding, and we can hardcode nonexisting dirs.
-- _LT_AC_TAGVAR(hardcode_action, $1)=immediate
-+ if test "$prev" != 'sed 50q "[$]0"'; then
-+ echo_test_string=`eval $prev`
-+ export echo_test_string
-+ exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
-+ else
-+ # Oops. We lost completely, so just stick with echo.
-+ ECHO=echo
-+ fi
-+ fi
-+ fi
-+ fi
- fi
--else
-- # We cannot hardcode anything, or else we can only hardcode existing
-- # directories.
-- _LT_AC_TAGVAR(hardcode_action, $1)=unsupported
- fi
--AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)])
-
--if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then
-- # Fast installation is not supported
-- enable_fast_install=no
--elif test "$shlibpath_overrides_runpath" = yes ||
-- test "$enable_shared" = no; then
-- # Fast installation is not necessary
-- enable_fast_install=needless
-+# Copy echo and quote the copy suitably for passing to libtool from
-+# the Makefile, instead of quoting the original, which is used later.
-+lt_ECHO=$ECHO
-+if test "X$lt_ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
-+ lt_ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
- fi
--])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH
-
-+AC_SUBST(lt_ECHO)
-+])
-+_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
-+_LT_DECL([], [ECHO], [1],
-+ [An echo program that does not interpret backslashes])
-+])# _LT_PROG_ECHO_BACKSLASH
-
--# AC_LIBTOOL_SYS_LIB_STRIP
--# ------------------------
--AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP],
--[striplib=
--old_striplib=
--AC_MSG_CHECKING([whether stripping libraries is possible])
--if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
-- test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
-- test -z "$striplib" && striplib="$STRIP --strip-unneeded"
-- AC_MSG_RESULT([yes])
--else
--# FIXME - insert some real tests, host_os isn't really good enough
-- case $host_os in
-- darwin*)
-- if test -n "$STRIP" ; then
-- striplib="$STRIP -x"
-- AC_MSG_RESULT([yes])
-- else
-- AC_MSG_RESULT([no])
--fi
-- ;;
-- *)
-- AC_MSG_RESULT([no])
-- ;;
-- esac
--fi
--])# AC_LIBTOOL_SYS_LIB_STRIP
-
-+# _LT_ENABLE_LOCK
-+# ---------------
-+m4_defun([_LT_ENABLE_LOCK],
-+[AC_ARG_ENABLE([libtool-lock],
-+ [AS_HELP_STRING([--disable-libtool-lock],
-+ [avoid locking (might break parallel builds)])])
-+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
-
--# AC_LIBTOOL_SYS_DYNAMIC_LINKER
--# -----------------------------
--# PORTME Fill in your ld.so characteristics
--AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER],
--[AC_MSG_CHECKING([dynamic linker characteristics])
--library_names_spec=
--libname_spec='lib$name'
--soname_spec=
--shrext_cmds=".so"
--postinstall_cmds=
--postuninstall_cmds=
--finish_cmds=
--finish_eval=
--shlibpath_var=
--shlibpath_overrides_runpath=unknown
--version_type=none
--dynamic_linker="$host_os ld.so"
--sys_lib_dlsearch_path_spec="/lib /usr/lib"
--if test "$GCC" = yes; then
-- sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
-- if echo "$sys_lib_search_path_spec" | grep ';' >/dev/null ; then
-- # if the path contains ";" then we assume it to be the separator
-- # otherwise default to the standard path separator (i.e. ":") - it is
-- # assumed that no part of a normal pathname contains ";" but that should
-- # okay in the real world where ";" in dirpaths is itself problematic.
-- sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
-- else
-- sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
-+# Some flags need to be propagated to the compiler or linker for good
-+# libtool support.
-+case $host in
-+ia64-*-hpux*)
-+ # Find out which ABI we are using.
-+ echo 'int i;' > conftest.$ac_ext
-+ if AC_TRY_EVAL(ac_compile); then
-+ case `/usr/bin/file conftest.$ac_objext` in
-+ *ELF-32*)
-+ HPUX_IA64_MODE="32"
-+ ;;
-+ *ELF-64*)
-+ HPUX_IA64_MODE="64"
-+ ;;
-+ esac
- fi
--else
-- sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
--fi
--need_lib_prefix=unknown
--hardcode_into_libs=no
--
--# when you set need_version to no, make sure it does not cause -set_version
--# flags to be left without arguments
--need_version=unknown
--
--case $host_os in
--aix3*)
-- version_type=linux
-- library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
-- shlibpath_var=LIBPATH
--
-- # AIX 3 has no versioning support, so we append a major version to the name.
-- soname_spec='${libname}${release}${shared_ext}$major'
-+ rm -rf conftest*
- ;;
--
--aix4* | aix5*)
-- version_type=linux
-- need_lib_prefix=no
-- need_version=no
-- hardcode_into_libs=yes
-- if test "$host_cpu" = ia64; then
-- # AIX 5 supports IA64
-- library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-- shlibpath_var=LD_LIBRARY_PATH
-- else
-- # With GCC up to 2.95.x, collect2 would create an import file
-- # for dependence libraries. The import file would start with
-- # the line `#! .'. This would cause the generated library to
-- # depend on `.', always an invalid library. This was fixed in
-- # development snapshots of GCC prior to 3.0.
-- case $host_os in
-- aix4 | aix4.[[01]] | aix4.[[01]].*)
-- if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
-- echo ' yes '
-- echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
-- :
-- else
-- can_build_shared=no
-- fi
-- ;;
-- esac
-- # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
-- # soname into executable. Probably we can add versioning support to
-- # collect2, so additional links can be useful in future.
-- if test "$aix_use_runtimelinking" = yes; then
-- # If using run time linking (on AIX 4.2 or later) use lib<name>.so
-- # instead of lib<name>.a to let people know that these are not
-- # typical AIX shared libraries.
-- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-+*-*-irix6*)
-+ # Find out which ABI we are using.
-+ echo '[#]line __oline__ "configure"' > conftest.$ac_ext
-+ if AC_TRY_EVAL(ac_compile); then
-+ if test "$lt_cv_prog_gnu_ld" = yes; then
-+ case `/usr/bin/file conftest.$ac_objext` in
-+ *32-bit*)
-+ LD="${LD-ld} -melf32bsmip"
-+ ;;
-+ *N32*)
-+ LD="${LD-ld} -melf32bmipn32"
-+ ;;
-+ *64-bit*)
-+ LD="${LD-ld} -melf64bmip"
-+ ;;
-+ esac
- else
-- # We preserve .a as extension for shared libraries through AIX4.2
-- # and later when we are not doing run time linking.
-- library_names_spec='${libname}${release}.a $libname.a'
-- soname_spec='${libname}${release}${shared_ext}$major'
-+ case `/usr/bin/file conftest.$ac_objext` in
-+ *32-bit*)
-+ LD="${LD-ld} -32"
-+ ;;
-+ *N32*)
-+ LD="${LD-ld} -n32"
-+ ;;
-+ *64-bit*)
-+ LD="${LD-ld} -64"
-+ ;;
-+ esac
- fi
-- shlibpath_var=LIBPATH
- fi
-+ rm -rf conftest*
- ;;
-
--amigaos*)
-- library_names_spec='$libname.ixlibrary $libname.a'
-- # Create ${libname}_ixlibrary.a entries in /sys/libs.
-- finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
-+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
-+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
-+ # Find out which ABI we are using.
-+ echo 'int i;' > conftest.$ac_ext
-+ if AC_TRY_EVAL(ac_compile); then
-+ case `/usr/bin/file conftest.o` in
-+ *32-bit*)
-+ case $host in
-+ x86_64-*kfreebsd*-gnu)
-+ LD="${LD-ld} -m elf_i386_fbsd"
-+ ;;
-+ x86_64-*linux*)
-+ LD="${LD-ld} -m elf_i386"
-+ ;;
-+ ppc64-*linux*|powerpc64-*linux*)
-+ LD="${LD-ld} -m elf32ppclinux"
-+ ;;
-+ s390x-*linux*)
-+ LD="${LD-ld} -m elf_s390"
-+ ;;
-+ sparc64-*linux*)
-+ LD="${LD-ld} -m elf32_sparc"
-+ ;;
-+ esac
-+ ;;
-+ *64-bit*)
-+ case $host in
-+ x86_64-*kfreebsd*-gnu)
-+ LD="${LD-ld} -m elf_x86_64_fbsd"
-+ ;;
-+ x86_64-*linux*)
-+ LD="${LD-ld} -m elf_x86_64"
-+ ;;
-+ ppc*-*linux*|powerpc*-*linux*)
-+ LD="${LD-ld} -m elf64ppc"
-+ ;;
-+ s390*-*linux*|s390*-*tpf*)
-+ LD="${LD-ld} -m elf64_s390"
-+ ;;
-+ sparc*-*linux*)
-+ LD="${LD-ld} -m elf64_sparc"
-+ ;;
-+ esac
-+ ;;
-+ esac
-+ fi
-+ rm -rf conftest*
- ;;
-
--beos*)
-- library_names_spec='${libname}${shared_ext}'
-- dynamic_linker="$host_os ld.so"
-- shlibpath_var=LIBRARY_PATH
-+*-*-sco3.2v5*)
-+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
-+ SAVE_CFLAGS="$CFLAGS"
-+ CFLAGS="$CFLAGS -belf"
-+ AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
-+ [AC_LANG_PUSH(C)
-+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
-+ AC_LANG_POP])
-+ if test x"$lt_cv_cc_needs_belf" != x"yes"; then
-+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
-+ CFLAGS="$SAVE_CFLAGS"
-+ fi
- ;;
--
--bsdi[[45]]*)
-- version_type=linux
-- need_version=no
-- library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-- soname_spec='${libname}${release}${shared_ext}$major'
-- finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
-- shlibpath_var=LD_LIBRARY_PATH
-- sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
-- sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
-- # the default ld.so.conf also contains /usr/contrib/lib and
-- # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
-- # libtool to hard-code these into programs
-+sparc*-*solaris*)
-+ # Find out which ABI we are using.
-+ echo 'int i;' > conftest.$ac_ext
-+ if AC_TRY_EVAL(ac_compile); then
-+ case `/usr/bin/file conftest.o` in
-+ *64-bit*)
-+ case $lt_cv_prog_gnu_ld in
-+ yes*) LD="${LD-ld} -m elf64_sparc" ;;
-+ *)
-+ if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
-+ LD="${LD-ld} -64"
-+ fi
-+ ;;
-+ esac
-+ ;;
-+ esac
-+ fi
-+ rm -rf conftest*
- ;;
-+esac
-
--cygwin* | mingw* | pw32*)
-- version_type=windows
-- shrext_cmds=".dll"
-- need_version=no
-- need_lib_prefix=no
-+need_locks="$enable_libtool_lock"
-+])# _LT_ENABLE_LOCK
-
-- case $GCC,$host_os in
-- yes,cygwin* | yes,mingw* | yes,pw32*)
-- library_names_spec='$libname.dll.a'
-- # DLL is installed to $(libdir)/../bin by postinstall_cmds
-- postinstall_cmds='base_file=`basename \${file}`~
-- dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
-- dldir=$destdir/`dirname \$dlpath`~
-- test -d \$dldir || mkdir -p \$dldir~
-- $install_prog $dir/$dlname \$dldir/$dlname~
-- chmod a+x \$dldir/$dlname'
-- postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
-- dlpath=$dir/\$dldll~
-- $rm \$dlpath'
-- shlibpath_overrides_runpath=yes
-
-- case $host_os in
-- cygwin*)
-- # Cygwin DLLs use 'cyg' prefix rather than 'lib'
-- soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuf