summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCarlo Landmeter <clandmeter@gmail.com>2010-09-27 15:28:03 +0000
committerCarlo Landmeter <clandmeter@gmail.com>2010-09-27 15:28:03 +0000
commitb8812541b5d1da95dc6b74f8e598bc448ad1cfa2 (patch)
treec3b80b03cd1b275bce7643b5006bcf241fbcd9ae
parentaff0782f90aa8b7aff8b5ca0d99b1f7ee245ba8d (diff)
downloadaports-b8812541b5d1da95dc6b74f8e598bc448ad1cfa2.tar.bz2
aports-b8812541b5d1da95dc6b74f8e598bc448ad1cfa2.tar.xz
main/mesa: upgrade to 7.8.2
-rw-r--r--main/mesa/APKBUILD51
-rw-r--r--main/mesa/fix-glx1.3-crash-xorg19.patch73
-rw-r--r--main/mesa/intel-revert-vbl.patch21
-rw-r--r--main/mesa/mesa-7.4-parallel.patch12
-rw-r--r--main/mesa/mesa-7.6.1-ldflags.patch20
-rw-r--r--main/mesa/mesa-7.7-link-shared.patch101
-rw-r--r--main/mesa/mesa-7.8-git.patch2423
7 files changed, 2522 insertions, 179 deletions
diff --git a/main/mesa/APKBUILD b/main/mesa/APKBUILD
index 712824df4..4fc56ec03 100644
--- a/main/mesa/APKBUILD
+++ b/main/mesa/APKBUILD
@@ -1,35 +1,40 @@
# Maintainer: Natanael Copa <ncopa@alpinelinux.org>
pkgname=mesa
-pkgver=7.7.1
-pkgrel=3
+pkgver=7.8.2
+pkgrel=0
pkgdesc="Mesa DRI OpenGL library"
url="http://www.mesa3d.org"
license="LGPL"
depends=
install="$pkgname.post-install $pkgname.post-deinstall"
subpackages="$pkgname-dev
- $pkgname-dri-ati:ati $pkgname-dri-ffb:ffb $pkgname-dri-intel:intel
- $pkgname-dri-mach64:mach64 $pkgname-dri-mga:mga $pkgname-dri-r128:r128
- $pkgname-dri-savage:savage $pkgname-dri-sis:sis
- $pkgname-dri-tdfx:tdfx $pkgname-dri-unichrome:unichrome
+ $pkgname-dri-intel:intel
+ $pkgname-dri-mach64:mach64
+ $pkgname-dri-mga:mga
+ $pkgname-dri-r128:r128
+ $pkgname-dri-savage:savage
+ $pkgname-dri-sis:sis
+ $pkgname-dri-tdfx:tdfx
+ $pkgname-dri-unichrome:unichrome
+ $pkgname-dri-ati:ati
+ $pkgname-dri-swrast:swrast
"
makedepends="pkgconfig libdrm-dev libxxf86vm-dev libxdamage-dev expat-dev
- dri2proto xextproto libx11-dev glproto python"
+ dri2proto xextproto libx11-dev glproto python libxt-dev"
source="ftp://ftp.freedesktop.org/pub/mesa/$pkgver/MesaLib-$pkgver.tar.bz2
- mesa-7.7-link-shared.patch
- intel-revert-vbl.patch
- mesa-7.4-parallel.patch
- mesa-7.6.1-ldflags.patch
- mesa-7.6.1-uclibc.patch"
+ mesa-7.6.1-uclibc.patch
+ mesa-7.8-git.patch"
depends_dev="libdrm-dev dri2proto libx11-dev libxext-dev libxxf86vm-dev
libxdamage-dev libxfixes-dev libxcb-dev"
_dri_driverdir=/usr/lib/xorg/modules/dri
+_builddir="$srcdir/Mesa-$pkgver"
+
prepare() {
- cd "$srcdir"/Mesa-$pkgver
+ cd "$_builddir"
for i in ../*.patch; do
msg "Applying $i..."
patch -p1 -i $i || return 1
@@ -37,7 +42,7 @@ prepare() {
}
build() {
- cd "$srcdir"/Mesa-$pkgver
+ cd "$_builddir"
export LDFLAGS="$LDFLAGS -Wl,-z,lazy"
./configure --prefix=/usr \
--with-dri-driverdir=$_dri_driverdir \
@@ -50,13 +55,14 @@ build() {
--disable-glw || return 1
make || return 1
+
# check so we dont have any bind NOW
scanelf -Rb . | grep NOW && return 1
return 0
}
package() {
- cd "$srcdir"/Mesa-$pkgver
+ cd "$_builddir"
make -j1 DESTDIR="$pkgdir" install || return 1
# remove symlink and recreate it inside install
# this makes it possible to switch libgl like with nvidia
@@ -68,7 +74,7 @@ package() {
_mv_dri() {
pkgdesc="Mesa DRI driver for $@"
install -d "$subpkgdir"/$_dri_driverdir
-
+
while [ $# -gt 0 ]; do
mv "$pkgdir"/$_dri_driverdir/${1}.so \
"$subpkgdir"/$_dri_driverdir/ || return 1
@@ -77,21 +83,16 @@ _mv_dri() {
}
ati() { _mv_dri radeon_dri r200_dri r300_dri r600_dri; }
-ffb() { _mv_dri ffb_dri; }
intel() { _mv_dri i810_dri i915_dri i965_dri; }
mach64() { _mv_dri mach64_dri; }
mga() { _mv_dri mga_dri; }
r128() { _mv_dri r128_dri; }
-s3v() { _mv_dri s3v_dri; }
savage() { _mv_dri savage_dri; }
sis() { _mv_dri sis_dri; }
tdfx() { _mv_dri tdfx_dri; }
-trident() { _mv_dri trident_dri; }
unichrome() { _mv_dri unichrome_dri; }
+swrast() { _mv_dri swrast_dri; }
-md5sums="46664d99e03f1e3ac078a7fea02af115 MesaLib-7.7.1.tar.bz2
-a966f459b6430dbe87a57c5f28f19816 mesa-7.7-link-shared.patch
-a111f4dc82e894f8801bc3fa129af7af intel-revert-vbl.patch
-75e1bb69f384e9d60544fa03c15cc0ec mesa-7.4-parallel.patch
-eb6bb53bb1643782aa572edc40d28629 mesa-7.6.1-ldflags.patch
-8d98e15310e0f2e1520beb9e6cb6ab41 mesa-7.6.1-uclibc.patch"
+md5sums="6be2d343a0089bfd395ce02aaf8adb57 MesaLib-7.8.2.tar.bz2
+8d98e15310e0f2e1520beb9e6cb6ab41 mesa-7.6.1-uclibc.patch
+397c1249edcf03227697fef3f7129fe4 mesa-7.8-git.patch"
diff --git a/main/mesa/fix-glx1.3-crash-xorg19.patch b/main/mesa/fix-glx1.3-crash-xorg19.patch
new file mode 100644
index 000000000..bd09b9e71
--- /dev/null
+++ b/main/mesa/fix-glx1.3-crash-xorg19.patch
@@ -0,0 +1,73 @@
+From 8f13c69e7658df3a97e388f210dae175639d6d8d Mon Sep 17 00:00:00 2001
+From: Chris Wilson <chris@chris-wilson.co.uk>
+Date: Fri, 16 Jul 2010 12:24:53 +0100
+Subject: [PATCH] intel: Fix invalidate before initialisation
+
+Fixes:
+
+ Bug 29091 - 1.9RC5 server crash when starting GLX 1.3 app with mesa 7.8
+ Intel dri2 driver.
+ https://bugs.freedesktop.org/show_bug.cgi?id=29091
+
+Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+---
+ src/mesa/drivers/dri/common/dri_util.c | 2 +-
+ src/mesa/drivers/dri/intel/intel_screen.c | 19 +++++++++++++++----
+ 2 files changed, 16 insertions(+), 5 deletions(-)
+
+diff --git a/src/mesa/drivers/dri/common/dri_util.c b/src/mesa/drivers/dri/common/dri_util.c
+index 75c9882..9a9bfed 100644
+--- a/src/mesa/drivers/dri/common/dri_util.c
++++ b/src/mesa/drivers/dri/common/dri_util.c
+@@ -432,7 +432,7 @@ driCreateNewDrawable(__DRIscreen *psp, const __DRIconfig *config,
+ */
+ (void) attrs;
+
+- pdp = malloc(sizeof *pdp);
++ pdp = calloc(1, sizeof *pdp);
+ if (!pdp) {
+ return NULL;
+ }
+diff --git a/src/mesa/drivers/dri/intel/intel_screen.c b/src/mesa/drivers/dri/intel/intel_screen.c
+index 6e4bb64..083b7bb 100644
+--- a/src/mesa/drivers/dri/intel/intel_screen.c
++++ b/src/mesa/drivers/dri/intel/intel_screen.c
+@@ -102,10 +102,21 @@ static const __DRItexBufferExtension intelTexBufferExtension = {
+ intelSetTexBuffer2,
+ };
+
++static inline struct intel_context *
++to_intel_context(__DRIdrawable *drawable)
++{
++ if (drawable->driContextPriv == NULL)
++ return NULL;
++
++ return drawable->driContextPriv->driverPrivate;
++}
++
+ static void
+ intelDRI2Flush(__DRIdrawable *drawable)
+ {
+- struct intel_context *intel = drawable->driContextPriv->driverPrivate;
++ struct intel_context *intel = to_intel_context(drawable);
++ if (!intel)
++ return;
+
+ if (intel->gen < 4)
+ INTEL_FIREVERTICES(intel);
+@@ -117,9 +128,9 @@ intelDRI2Flush(__DRIdrawable *drawable)
+ static void
+ intelDRI2Invalidate(__DRIdrawable *drawable)
+ {
+- struct intel_context *intel = drawable->driContextPriv->driverPrivate;
+-
+- intel->using_dri2_swapbuffers = GL_TRUE;
++ struct intel_context *intel = to_intel_context(drawable);
++ if (intel)
++ intel->using_dri2_swapbuffers = GL_TRUE;
+ dri2InvalidateDrawable(drawable);
+ }
+
+--
+1.7.1
+
diff --git a/main/mesa/intel-revert-vbl.patch b/main/mesa/intel-revert-vbl.patch
deleted file mode 100644
index 039441473..000000000
--- a/main/mesa/intel-revert-vbl.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-commit 532d2051245a1d8afe7ca236f1d966d555bb121a
-Author: Dave Airlie <airlied@linux.ie>
-Date: Fri Sep 12 17:21:25 2008 +1000
-
- Revert "intel: sync to vblank by default"
-
- This reverts commit e9bf3e4cc9a7e4bcd4c45bd707541d26ecdf0409.
-
-diff --git a/src/mesa/drivers/dri/intel/intel_screen.c b/src/mesa/drivers/dri/intel/intel_screen.c
-index c193830..f02192d 100644
---- a/src/mesa/drivers/dri/intel/intel_screen.c
-+++ b/src/mesa/drivers/dri/intel/intel_screen.c
-@@ -55,7 +55,7 @@ PUBLIC const char __driConfigOptions[] =
- DRI_CONF_BEGIN
- DRI_CONF_SECTION_PERFORMANCE
- DRI_CONF_FTHROTTLE_MODE(DRI_CONF_FTHROTTLE_IRQS)
-- DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_ALWAYS_SYNC)
-+ DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_DEF_INTERVAL_0)
- /* Options correspond to DRI_CONF_BO_REUSE_DISABLED,
- * DRI_CONF_BO_REUSE_ALL
- */
diff --git a/main/mesa/mesa-7.4-parallel.patch b/main/mesa/mesa-7.4-parallel.patch
deleted file mode 100644
index b4e37049d..000000000
--- a/main/mesa/mesa-7.4-parallel.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -ru Mesa-7.4.orig/src/mesa/drivers/dri/Makefile Mesa-7.4/src/mesa/drivers/dri/Makefile
---- Mesa-7.4.orig/src/mesa/drivers/dri/Makefile 2009-04-11 18:08:41.000000000 +0000
-+++ Mesa-7.4/src/mesa/drivers/dri/Makefile 2009-04-11 18:10:09.000000000 +0000
-@@ -18,7 +18,7 @@
- $(TOP)/$(LIB_DIR)/libdricore.so: $(TOP)/$(LIB_DIR) libdricore.so
- $(INSTALL) libdricore.so $(TOP)/$(LIB_DIR)
-
--subdirs:
-+subdirs: $(TOP)/$(LIB_DIR)/libdricore.so
- @for dir in $(DRI_DIRS) ; do \
- if [ -d $$dir ] ; then \
- (cd $$dir && $(MAKE)) || exit 1 ; \
diff --git a/main/mesa/mesa-7.6.1-ldflags.patch b/main/mesa/mesa-7.6.1-ldflags.patch
deleted file mode 100644
index 56914b711..000000000
--- a/main/mesa/mesa-7.6.1-ldflags.patch
+++ /dev/null
@@ -1,20 +0,0 @@
-diff --git a/src/gallium/winsys/drm/Makefile.template b/src/gallium/winsys/drm/Makefile.template
-index 9635c3c..88e02c0 100644
---- a/src/gallium/winsys/drm/Makefile.template
-+++ b/src/gallium/winsys/drm/Makefile.template
-@@ -83,6 +83,7 @@ default: depend symlinks $(TOP)/$(LIB_DIR)/gallium/$(LIBNAME)
-
- $(LIBNAME): $(OBJECTS) $(MESA_MODULES) $(PIPE_DRIVERS) $(WINOBJ) Makefile $(TOP)/src/mesa/drivers/dri/Makefile.template
- $(MKLIB) -noprefix -o $@ \
-+ -ldflags "$(LDFLAGS)" \
- $(OBJECTS) $(PIPE_DRIVERS) \
- -Wl,--start-group $(MESA_MODULES) -Wl,--end-group \
- $(WINOBJ) $(DRI_LIB_DEPS) $(DRIVER_EXTRAS)
-@@ -90,6 +91,7 @@ $(LIBNAME): $(OBJECTS) $(MESA_MODULES) $(PIPE_DRIVERS) $(WINOBJ) Makefile $(TOP)
- $(LIBNAME_EGL): $(WINSYS_OBJECTS) $(LIBS)
- $(MKLIB) -o $(LIBNAME_EGL) \
- -linker "$(CC)" \
-+ -ldflags "$(LDFLAGS)" \
- -noprefix \
- $(OBJECTS) $(MKLIB_OPTIONS) $(WINSYS_OBJECTS) $(PIPE_DRIVERS) $(WINOBJ) $(DRI_LIB_DEPS) \
- --whole-archive $(LIBS) $(GALLIUM_AUXILIARIES) --no-whole-archive $(DRIVER_EXTRAS)
diff --git a/main/mesa/mesa-7.7-link-shared.patch b/main/mesa/mesa-7.7-link-shared.patch
deleted file mode 100644
index 8c6b562d7..000000000
--- a/main/mesa/mesa-7.7-link-shared.patch
+++ /dev/null
@@ -1,101 +0,0 @@
-diff -up mesa-20091221/src/mesa/drivers/dri/Makefile.da mesa-20091221/src/mesa/drivers/dri/Makefile
---- mesa-20091221/src/mesa/drivers/dri/Makefile.da 2009-12-21 08:09:11.000000000 +1000
-+++ mesa-20091221/src/mesa/drivers/dri/Makefile 2009-12-21 08:43:03.000000000 +1000
-@@ -6,12 +6,17 @@ include $(TOP)/configs/current
-
-
-
--default: $(TOP)/$(LIB_DIR) subdirs dri.pc
-+default: $(TOP)/$(LIB_DIR) $(TOP)/$(LIB_DIR)/libdricore.so subdirs dri.pc
-
-
- $(TOP)/$(LIB_DIR):
- -mkdir $(TOP)/$(LIB_DIR)
-
-+libdricore.so:
-+ gcc -shared -o libdricore.so -Wl,--whole-archive ../../libmesa.a -Wl,--no-whole-archive $(LDFLAGS) -lm -lpthread -lc
-+
-+$(TOP)/$(LIB_DIR)/libdricore.so: $(TOP)/$(LIB_DIR) libdricore.so
-+ $(INSTALL) libdricore.so $(TOP)/$(LIB_DIR)
-
- subdirs:
- @for dir in $(DRI_DIRS) ; do \
-@@ -32,12 +37,14 @@ dri.pc: dri.pc.in
- $(pcedit) $< > $@
-
-
--install: dri.pc
-+install: dri.pc $(TOP)/$(LIB_DIR)/libdricore.so
- @for dir in $(DRI_DIRS) ; do \
- if [ -d $$dir ] ; then \
- (cd $$dir && $(MAKE) install) || exit 1 ; \
- fi \
- done
-+ $(INSTALL) -d $(DESTDIR)$(DRI_DRIVER_INSTALL_DIR)
-+ $(INSTALL) -m 755 $(TOP)/$(LIB_DIR)/libdricore.so $(DESTDIR)$(DRI_DRIVER_INSTALL_DIR)
- $(INSTALL) -d $(DESTDIR)$(INSTALL_INC_DIR)/GL/internal
- $(INSTALL) -m 0644 $(TOP)/include/GL/internal/dri_interface.h \
- $(DESTDIR)$(INSTALL_INC_DIR)/GL/internal
-@@ -51,5 +58,6 @@ clean:
- (cd $$dir && $(MAKE) clean) ; \
- fi \
- done
-+ -rm -f libdricore.so $(TOP)/$(LIB_DIR)/libdricore.so
- -rm -f common/*.o
- -rm -f *.pc
-diff -up mesa-20091221/src/mesa/drivers/dri/Makefile.template.da mesa-20091221/src/mesa/drivers/dri/Makefile.template
---- mesa-20091221/src/mesa/drivers/dri/Makefile.template.da 2009-12-21 08:09:11.000000000 +1000
-+++ mesa-20091221/src/mesa/drivers/dri/Makefile.template 2009-12-21 08:43:40.000000000 +1000
-@@ -1,6 +1,6 @@
- # -*-makefile-*-
-
--MESA_MODULES = $(TOP)/src/mesa/libmesa.a
-+MESA_MODULES = $(TOP)/$(LIB_DIR)/libdricore.so
-
- COMMON_GALLIUM_SOURCES = \
- ../common/utils.c \
-@@ -70,7 +70,8 @@ lib: symlinks subdirs depend
- $(LIBNAME): $(OBJECTS) $(MESA_MODULES) $(EXTRA_MODULES) $(WINOBJ) Makefile \
- $(TOP)/src/mesa/drivers/dri/Makefile.template
- $(MKLIB) -o $@ -noprefix -linker '$(CC)' -ldflags '$(LDFLAGS)' \
-- $(OBJECTS) $(MESA_MODULES) $(EXTRA_MODULES) $(WINOBJ) \
-+ -L$(TOP)/$(LIB_DIR) -Wl,-R$(DRI_DRIVER_INSTALL_DIR) -ldricore \
-+ $(OBJECTS) $(EXTRA_MODULES) $(WINOBJ) \
- $(DRI_LIB_DEPS)
-
-
-diff -up mesa-20091221/src/mesa/x86/read_rgba_span_x86.S.da mesa-20091221/src/mesa/x86/read_rgba_span_x86.S
---- mesa-20091221/src/mesa/x86/read_rgba_span_x86.S.da 2009-12-21 08:09:11.000000000 +1000
-+++ mesa-20091221/src/mesa/x86/read_rgba_span_x86.S 2009-12-21 08:43:03.000000000 +1000
-@@ -77,7 +77,6 @@
- */
-
- .globl _generic_read_RGBA_span_BGRA8888_REV_MMX
--.hidden _generic_read_RGBA_span_BGRA8888_REV_MMX
- .type _generic_read_RGBA_span_BGRA8888_REV_MMX, @function
- _generic_read_RGBA_span_BGRA8888_REV_MMX:
- pushl %ebx
-@@ -172,7 +171,6 @@ _generic_read_RGBA_span_BGRA8888_REV_MMX
- */
-
- .globl _generic_read_RGBA_span_BGRA8888_REV_SSE
--.hidden _generic_read_RGBA_span_BGRA8888_REV_SSE
- .type _generic_read_RGBA_span_BGRA8888_REV_SSE, @function
- _generic_read_RGBA_span_BGRA8888_REV_SSE:
- pushl %esi
-@@ -335,7 +333,6 @@ _generic_read_RGBA_span_BGRA8888_REV_SSE
-
- .text
- .globl _generic_read_RGBA_span_BGRA8888_REV_SSE2
--.hidden _generic_read_RGBA_span_BGRA8888_REV_SSE2
- .type _generic_read_RGBA_span_BGRA8888_REV_SSE2, @function
- _generic_read_RGBA_span_BGRA8888_REV_SSE2:
- pushl %esi
-@@ -494,7 +491,6 @@ _generic_read_RGBA_span_BGRA8888_REV_SSE
-
- .text
- .globl _generic_read_RGBA_span_RGB565_MMX
-- .hidden _generic_read_RGBA_span_RGB565_MMX
- .type _generic_read_RGBA_span_RGB565_MMX, @function
-
- _generic_read_RGBA_span_RGB565_MMX:
diff --git a/main/mesa/mesa-7.8-git.patch b/main/mesa/mesa-7.8-git.patch
new file mode 100644
index 000000000..169b38b05
--- /dev/null
+++ b/main/mesa/mesa-7.8-git.patch
@@ -0,0 +1,2423 @@
+diff --git a/Makefile b/Makefile
+index 84d0038..63fdf87 100644
+--- a/Makefile
++++ b/Makefile
+@@ -180,7 +180,7 @@ ultrix-gcc:
+
+ # Rules for making release tarballs
+
+-VERSION=7.8.2
++VERSION=7.8.3
+ DIRECTORY = Mesa-$(VERSION)
+ LIB_NAME = MesaLib-$(VERSION)
+ DEMO_NAME = MesaDemos-$(VERSION)
+@@ -285,9 +285,6 @@ MAIN_FILES = \
+ $(DIRECTORY)/src/mesa/x86-64/*.[chS] \
+ $(DIRECTORY)/src/mesa/x86-64/Makefile \
+ $(DIRECTORY)/progs/Makefile \
+- $(DIRECTORY)/progs/util/README \
+- $(DIRECTORY)/progs/util/*.[ch] \
+- $(DIRECTORY)/progs/util/sampleMakefile \
+ $(DIRECTORY)/windows/VC8/
+
+ ES_FILES = \
+@@ -438,7 +435,10 @@ DEMO_FILES = \
+ $(DIRECTORY)/progs/glsl/*.c \
+ $(DIRECTORY)/progs/glsl/*.frag \
+ $(DIRECTORY)/progs/glsl/*.vert \
+- $(DIRECTORY)/progs/glsl/*.shtest
++ $(DIRECTORY)/progs/glsl/*.shtest \
++ $(DIRECTORY)/progs/util/README \
++ $(DIRECTORY)/progs/util/*.[ch] \
++ $(DIRECTORY)/progs/util/sampleMakefile
+
+ GLUT_FILES = \
+ $(DIRECTORY)/include/GL/glut.h \
+diff --git a/configs/autoconf.in b/configs/autoconf.in
+index fbd5faa..6218be9 100644
+--- a/configs/autoconf.in
++++ b/configs/autoconf.in
+@@ -26,6 +26,11 @@ INTEL_LIBS = @INTEL_LIBS@
+ INTEL_CFLAGS = @INTEL_CFLAGS@
+ X11_LIBS = @X11_LIBS@
+ X11_CFLAGS = @X11_CFLAGS@
++GLW_CFLAGS = @GLW_CFLAGS@
++GLUT_CFLAGS = @GLUT_CFLAGS@
++
++# dlopen
++DLOPEN_LIBS = @DLOPEN_LIBS@
+
+ # Assembler
+ MESA_ASM_SOURCES = @MESA_ASM_SOURCES@
+diff --git a/configs/default b/configs/default
+index f12bec8..d4b45a3 100644
+--- a/configs/default
++++ b/configs/default
+@@ -121,6 +121,8 @@ APP_LIB_DEPS = $(EXTRA_LIB_PATH) -L$(TOP)/$(LIB_DIR) -l$(GLUT_LIB) -l$(GLU_LI
+ APP_LIB_DEPS = -lm
+ X11_LIBS = -lX11
+
++DLOPEN_LIBS = -ldl
++
+ # Installation directories (for make install)
+ INSTALL_DIR = /usr/local
+ INSTALL_LIB_DIR = $(INSTALL_DIR)/$(LIB_DIR)
+diff --git a/configure.ac b/configure.ac
+index e711634..e15371f 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -398,6 +398,7 @@ dnl Check to see if dlopen is in default libraries (like Solaris, which
+ dnl has it in libc), or if libdl is needed to get it.
+ AC_CHECK_FUNC([dlopen], [],
+ [AC_CHECK_LIB([dl], [dlopen], [DLOPEN_LIBS="-ldl"])])
++AC_SUBST([DLOPEN_LIBS])
+
+ dnl See if posix_memalign is available
+ AC_CHECK_FUNC([posix_memalign], [DEFINES="$DEFINES -DHAVE_POSIX_MEMALIGN"])
+@@ -699,7 +700,7 @@ AC_SUBST([DRI_DRIVER_SEARCH_DIR])
+ dnl Direct rendering or just indirect rendering
+ AC_ARG_ENABLE([driglx-direct],
+ [AS_HELP_STRING([--disable-driglx-direct],
+- [enable direct rendering in GLX for DRI @<:@default=enabled@:>@])],
++ [enable direct rendering in GLX and EGL for DRI @<:@default=enabled@:>@])],
+ [driglx_direct="$enableval"],
+ [driglx_direct="yes"])
+ dnl Which drivers to build - default is chosen by platform
+@@ -1102,10 +1103,6 @@ fi
+
+ if test "x$enable_glut" = xyes; then
+ SRC_DIRS="$SRC_DIRS glut/glx"
+- GLUT_CFLAGS=""
+- if test "x$GCC" = xyes; then
+- GLUT_CFLAGS="-fexceptions"
+- fi
+ if test "$x11_pkgconfig" = yes; then
+ PKG_CHECK_MODULES([GLUT],[x11 xmu xi])
+ GLUT_PC_REQ_PRIV="x11 xmu xi"
+@@ -1116,6 +1113,9 @@ if test "x$enable_glut" = xyes; then
+ GLUT_PC_LIB_PRIV="$GLUT_LIB_DEPS"
+ GLUT_PC_CFLAGS="$X11_INCLUDES"
+ fi
++ if test "x$GCC" = xyes; then
++ GLUT_CFLAGS="$GLUT_CFLAGS -fexceptions"
++ fi
+ GLUT_LIB_DEPS="$GLUT_LIB_DEPS -lm"
+ GLUT_PC_LIB_PRIV="$GLUT_PC_LIB_PRIV -lm"
+
+@@ -1217,6 +1217,10 @@ yes)
+ if test "x$enable_egl" != xyes; then
+ AC_MSG_ERROR([cannot build egl state tracker without EGL library])
+ fi
++ # define GLX_DIRECT_RENDERING even when the driver is not dri
++ if test "x$mesa_driver" != xdri -a "x$driglx_direct" = xyes; then
++ DEFINES="$DEFINES -DGLX_DIRECT_RENDERING"
++ fi
+ ;;
+ xorg)
+ PKG_CHECK_MODULES([LIBDRM_XORG], [libdrm >= $LIBDRM_XORG_REQUIRED])
+diff --git a/docs/news.html b/docs/news.html
+index 92e2a18..01e2834 100644
+--- a/docs/news.html
++++ b/docs/news.html
+@@ -11,6 +11,14 @@
+ <H1>News</H1>
+
+
++<h2>TBD, 2010</h2>
++
++<p>
++<a href="relnotes-7.8.3.html">Mesa 7.8.3</a> is released. This is a bug-fix
++release collecting fixes since the 7.8.2 release.
++</p>
++
++
+ <h2>June 16, 2010</h2>
+
+ <p>
+diff --git a/docs/relnotes-7.8.2.html b/docs/relnotes-7.8.2.html
+index 4d7758d..1393b2e 100644
+--- a/docs/relnotes-7.8.2.html
++++ b/docs/relnotes-7.8.2.html
+@@ -142,7 +142,5 @@ a471807b65e49c325808ba4551be93ed MesaGLUT-7.8.2.tar.bz2
+ </ul>
+
+
+-<h2>Changes</h2>
+-<p>None.</p>
+ </body>
+ </html>
+diff --git a/docs/relnotes-7.8.3.html b/docs/relnotes-7.8.3.html
+new file mode 100644
+index 0000000..1e9f433
+--- /dev/null
++++ b/docs/relnotes-7.8.3.html
+@@ -0,0 +1,89 @@
++<HTML>
++
++<TITLE>Mesa Release Notes</TITLE>
++
++<head><link rel="stylesheet" type="text/css" href="mesa.css"></head>
++
++<BODY>
++
++<body bgcolor="#eeeeee">
++
++<H1>Mesa 7.8.3 Release Notes / (date tbd)</H1>
++
++<p>
++Mesa 7.8.3 is a bug fix release which fixes bugs found since the 7.8.2 release.
++</p>
++<p>
++Mesa 7.8.3 implements the OpenGL 2.1 API, but the version reported by
++glGetString(GL_VERSION) depends on the particular driver being used.
++Some drivers don't support all the features required in OpenGL 2.1.
++</p>
++<p>
++See the <a href="install.html">Compiling/Installing page</a> for prerequisites
++for DRI hardware acceleration.
++</p>
++
++
++<h2>MD5 checksums</h2>
++<pre>
++x MesaLib-7.8.3.tar.gz
++x MesaLib-7.8.3.tar.bz2
++x MesaLib-7.8.3.zip
++x MesaDemos-7.8.3.tar.gz
++x MesaDemos-7.8.3.tar.bz2
++x MesaDemos-7.8.3.zip
++x MesaGLUT-7.8.3.tar.gz
++x MesaGLUT-7.8.3.tar.bz2
++x MesaGLUT-7.8.3.zip
++</pre>
++
++
++<h2>New features</h2>
++<p>None.</p>
++
++
++<h2>Changes</h2>
++<ul>
++<li>The radeon driver should use less memory when searching for a valid mip
++image.</li>
++</ul>
++
++
++<h2>Bug fixes</h2>
++<ul>
++<li>Fix unsupported FB with D24S8 (bug
++ <a href="https://bugs.freedesktop.org/show_bug.cgi?id=23670">29116</a>)</li>
++<li>Fix ReadPixels crash when reading depth/stencil from an FBO</li>
++<li>Fixed a bug rendering to 16-bit buffers using swrast.</li>
++<li>Fixed a state tracker/TGSI bug that caused crashes when using Windows'
++ memory debugging features.</li>
++<li>Fixed an issue rendering to 32-bit channels with swrast (bug
++ <a href="https://bugs.freedesktop.org/show_bug.cgi?id=29487">29487</a>)</li>
++<li>GLSL: fix indirect <TT>gl_TextureMatrix</TT> addressing (bug
++ <a href="https://bugs.freedesktop.org/show_bug.cgi?id=28967">28967</a>)</li>
++<li>GLSL: fix for bug
++ <a href="https://bugs.freedesktop.org/show_bug.cgi?id=27216">27216</a></li>
++<li>GLSL: fix zw fragcoord entries in some cases (bug
++ <a href="https://bugs.freedesktop.org/show_bug.cgi?id=29183">29183</a>)</li>
++<li>Fix texture env generation in some cases (bug
++ <a href="https://bugs.freedesktop.org/show_bug.cgi?id=28169">28169</a>)</li>
++<li>osmesa: a fix for calling <TT>OSMesaMakeCurrent</TT> twice was applied (bug
++ <a href="https://bugs.freedesktop.org/show_bug.cgi?id=10966">10966</a></li>
++<li>A bug was fixed which could cause Mesa to ignore the
++ <TT>MESA_EXTENSION_OVERRIDE</TT> environment variable.</li>
++<li>A bug related to specular highlights on backfaces was fixed.</li>
++<li>A radeon-specific issue with <TT>glCopyTex(Sub)Image</TT> was
++ corrected.</li>
++<li>radeon/wine: flush command stream in more cases, fixing wine d3d9
++ tests.</li>
++<li>r600: fix sin+cos normalization.</li>
++<li>r600: (properly) ignore <TT>GL_COORD_REPLACE</TT> when point sprites are
++ disabled.</li>
++<li>radeon: avoid flushing when the context is not current.</li>
++<li>r300c: a bug affecting unaligned BOs was fixed.</li>
++<li>r300c: a hardlock caused by ARB_half_float_vertex incorrectly advertised on some chipsets.</li>
++</ul>
++
++
++</body>
++</html>
+diff --git a/docs/relnotes.html b/docs/relnotes.html
+index 39b02b8..46f6469 100644
+--- a/docs/relnotes.html
++++ b/docs/relnotes.html
+@@ -13,6 +13,7 @@ The release notes summarize what's new or changed in each Mesa release.
+ </p>
+
+ <UL>
++<LI><A HREF="relnotes-7.8.3.html">7.8.3 release notes</A>
+ <LI><A HREF="relnotes-7.8.2.html">7.8.2 release notes</A>
+ <LI><A HREF="relnotes-7.8.1.html">7.8.1 release notes</A>
+ <LI><A HREF="relnotes-7.8.html">7.8 release notes</A>
+diff --git a/include/GL/gl_mangle.h b/include/GL/gl_mangle.h
+index 43d2e89..15589d8 100644
+--- a/include/GL/gl_mangle.h
++++ b/include/GL/gl_mangle.h
+@@ -56,6 +56,7 @@
+ #define glBeginOcclusionQueryNV MANGLE(BeginOcclusionQueryNV)
+ #define glBeginPerfMonitorAMD MANGLE(BeginPerfMonitorAMD)
+ #define glBeginQueryARB MANGLE(BeginQueryARB)
++#define glBeginQueryIndexed MANGLE(BeginQueryIndexed)
+ #define glBeginQuery MANGLE(BeginQuery)
+ #define glBeginTransformFeedbackEXT MANGLE(BeginTransformFeedbackEXT)
+ #define glBeginTransformFeedback MANGLE(BeginTransformFeedback)
+@@ -75,6 +76,7 @@
+ #define glBindBufferRange MANGLE(BindBufferRange)
+ #define glBindBufferRangeNV MANGLE(BindBufferRangeNV)
+ #define glBindFragDataLocationEXT MANGLE(BindFragDataLocationEXT)
++#define glBindFragDataLocationIndexed MANGLE(BindFragDataLocationIndexed)
+ #define glBindFragDataLocation MANGLE(BindFragDataLocation)
+ #define glBindFragmentShaderATI MANGLE(BindFragmentShaderATI)
+ #define glBindFramebufferEXT MANGLE(BindFramebufferEXT)
+@@ -87,10 +89,12 @@
+ #define glBindProgramNV MANGLE(BindProgramNV)
+ #define glBindRenderbufferEXT MANGLE(BindRenderbufferEXT)
+ #define glBindRenderbuffer MANGLE(BindRenderbuffer)
++#define glBindSampler MANGLE(BindSampler)
+ #define glBindTexGenParameterEXT MANGLE(BindTexGenParameterEXT)
+ #define glBindTextureEXT MANGLE(BindTextureEXT)
+ #define glBindTexture MANGLE(BindTexture)
+ #define glBindTextureUnitParameterEXT MANGLE(BindTextureUnitParameterEXT)
++#define glBindTransformFeedback MANGLE(BindTransformFeedback)
+ #define glBindTransformFeedbackNV MANGLE(BindTransformFeedbackNV)
+ #define glBindVertexArrayAPPLE MANGLE(BindVertexArrayAPPLE)
+ #define glBindVertexArray MANGLE(BindVertexArray)
+@@ -215,6 +219,10 @@
+ #define glColorMaskIndexedEXT MANGLE(ColorMaskIndexedEXT)
+ #define glColorMask MANGLE(ColorMask)
+ #define glColorMaterial MANGLE(ColorMaterial)
++#define glColorP3ui MANGLE(ColorP3ui)
++#define glColorP3uiv MANGLE(ColorP3uiv)
++#define glColorP4ui MANGLE(ColorP4ui)
++#define glColorP4uiv MANGLE(ColorP4uiv)
+ #define glColorPointerEXT MANGLE(ColorPointerEXT)
+ #define glColorPointerListIBM MANGLE(ColorPointerListIBM)
+ #define glColorPointer MANGLE(ColorPointer)
+@@ -236,6 +244,7 @@
+ #define glCombinerParameterivNV MANGLE(CombinerParameterivNV)
+ #define glCombinerStageParameterfvNV MANGLE(CombinerStageParameterfvNV)
+ #define glCompileShaderARB MANGLE(CompileShaderARB)
++#define glCompileShaderIncludeARB MANGLE(CompileShaderIncludeARB)
+ #define glCompileShader MANGLE(CompileShader)
+ #define glCompressedMultiTexImage1DEXT MANGLE(CompressedMultiTexImage1DEXT)
+ #define glCompressedMultiTexImage2DEXT MANGLE(CompressedMultiTexImage2DEXT)
+@@ -326,6 +335,7 @@
+ #define glDeleteFramebuffersEXT MANGLE(DeleteFramebuffersEXT)
+ #define glDeleteFramebuffers MANGLE(DeleteFramebuffers)
+ #define glDeleteLists MANGLE(DeleteLists)
++#define glDeleteNamedStringARB MANGLE(DeleteNamedStringARB)
+ #define glDeleteObjectARB MANGLE(DeleteObjectARB)
+ #define glDeleteOcclusionQueriesNV MANGLE(DeleteOcclusionQueriesNV)
+ #define glDeletePerfMonitorsAMD MANGLE(DeletePerfMonitorsAMD)
+@@ -336,10 +346,12 @@
+ #define glDeleteQueries MANGLE(DeleteQueries)
+ #define glDeleteRenderbuffersEXT MANGLE(DeleteRenderbuffersEXT)
+ #define glDeleteRenderbuffers MANGLE(DeleteRenderbuffers)
++#define glDeleteSamplers MANGLE(DeleteSamplers)
+ #define glDeleteShader MANGLE(DeleteShader)
+ #define glDeleteSync MANGLE(DeleteSync)
+ #define glDeleteTexturesEXT MANGLE(DeleteTexturesEXT)
+ #define glDeleteTextures MANGLE(DeleteTextures)
++#define glDeleteTransformFeedbacks MANGLE(DeleteTransformFeedbacks)
+ #define glDeleteTransformFeedbacksNV MANGLE(DeleteTransformFeedbacksNV)
+ #define glDeleteVertexArraysAPPLE MANGLE(DeleteVertexArraysAPPLE)
+ #define glDeleteVertexArrays MANGLE(DeleteVertexArrays)
+@@ -363,6 +375,7 @@
+ #define glDisableVertexAttribArrayARB MANGLE(DisableVertexAttribArrayARB)
+ #define glDisableVertexAttribArray MANGLE(DisableVertexAttribArray)
+ #define glDrawArraysEXT MANGLE(DrawArraysEXT)
++#define glDrawArraysIndirect MANGLE(DrawArraysIndirect)
+ #define glDrawArraysInstancedARB MANGLE(DrawArraysInstancedARB)
+ #define glDrawArraysInstancedEXT MANGLE(DrawArraysInstancedEXT)
+ #define glDrawArraysInstanced MANGLE(DrawArraysInstanced)
+@@ -374,6 +387,7 @@
+ #define glDrawElementArrayAPPLE MANGLE(DrawElementArrayAPPLE)
+ #define glDrawElementArrayATI MANGLE(DrawElementArrayATI)
+ #define glDrawElementsBaseVertex MANGLE(DrawElementsBaseVertex)
++#define glDrawElementsIndirect MANGLE(DrawElementsIndirect)
+ #define glDrawElementsInstancedARB MANGLE(DrawElementsInstancedARB)
+ #define glDrawElementsInstancedBaseVertex MANGLE(DrawElementsInstancedBaseVertex)
+ #define glDrawElementsInstancedEXT MANGLE(DrawElementsInstancedEXT)
+@@ -386,7 +400,9 @@
+ #define glDrawRangeElementsBaseVertex MANGLE(DrawRangeElementsBaseVertex)
+ #define glDrawRangeElementsEXT MANGLE(DrawRangeElementsEXT)
+ #define glDrawRangeElements MANGLE(DrawRangeElements)
++#define glDrawTransformFeedback MANGLE(DrawTransformFeedback)
+ #define glDrawTransformFeedbackNV MANGLE(DrawTransformFeedbackNV)
++#define glDrawTransformFeedbackStream MANGLE(DrawTransformFeedbackStream)
+ #define glEdgeFlagFormatNV MANGLE(EdgeFlagFormatNV)
+ #define glEdgeFlag MANGLE(EdgeFlag)
+ #define glEdgeFlagPointerEXT MANGLE(EdgeFlagPointerEXT)
+@@ -414,6 +430,7 @@
+ #define glEndOcclusionQueryNV MANGLE(EndOcclusionQueryNV)
+ #define glEndPerfMonitorAMD MANGLE(EndPerfMonitorAMD)
+ #define glEndQueryARB MANGLE(EndQueryARB)
++#define glEndQueryIndexed MANGLE(EndQueryIndexed)
+ #define glEndQuery MANGLE(EndQuery)
+ #define glEndTransformFeedbackEXT MANGLE(EndTransformFeedbackEXT)
+ #define glEndTransformFeedback MANGLE(EndTransformFeedback)
+@@ -498,7 +515,6 @@
+ #define glFramebufferTextureEXT MANGLE(FramebufferTextureEXT)
+ #define glFramebufferTextureFaceARB MANGLE(FramebufferTextureFaceARB)
+ #define glFramebufferTextureFaceEXT MANGLE(FramebufferTextureFaceEXT)
+-#define glFramebufferTextureFace MANGLE(FramebufferTextureFace)
+ #define glFramebufferTextureLayerARB MANGLE(FramebufferTextureLayerARB)
+ #define glFramebufferTextureLayerEXT MANGLE(FramebufferTextureLayerEXT)
+ #define glFramebufferTextureLayer MANGLE(FramebufferTextureLayer)
+@@ -529,15 +545,20 @@
+ #define glGenQueries MANGLE(GenQueries)
+ #define glGenRenderbuffersEXT MANGLE(GenRenderbuffersEXT)
+ #define glGenRenderbuffers MANGLE(GenRenderbuffers)
++#define glGenSamplers MANGLE(GenSamplers)
+ #define glGenSymbolsEXT MANGLE(GenSymbolsEXT)
+ #define glGenTexturesEXT MANGLE(GenTexturesEXT)
+ #define glGenTextures MANGLE(GenTextures)
++#define glGenTransformFeedbacks MANGLE(GenTransformFeedbacks)
+ #define glGenTransformFeedbacksNV MANGLE(GenTransformFeedbacksNV)
+ #define glGenVertexArraysAPPLE MANGLE(GenVertexArraysAPPLE)
+ #define glGenVertexArrays MANGLE(GenVertexArrays)
+ #define glGenVertexShadersEXT MANGLE(GenVertexShadersEXT)
+ #define glGetActiveAttribARB MANGLE(GetActiveAttribARB)
+ #define glGetActiveAttrib MANGLE(GetActiveAttrib)
++#define glGetActiveSubroutineName MANGLE(GetActiveSubroutineName)
++#define glGetActiveSubroutineUniformiv MANGLE(GetActiveSubroutineUniformiv)
++#define glGetActiveSubroutineUniformName MANGLE(GetActiveSubroutineUniformName)
+ #define glGetActiveUniformARB MANGLE(GetActiveUniformARB)
+ #define glGetActiveUniformBlockiv MANGLE(GetActiveUniformBlockiv)
+ #define glGetActiveUniformBlockName MANGLE(GetActiveUniformBlockName)
+@@ -599,6 +620,7 @@
+ #define glGetFloatIndexedvEXT MANGLE(GetFloatIndexedvEXT)
+ #define glGetFloatv MANGLE(GetFloatv)
+ #define glGetFogFuncSGIS MANGLE(GetFogFuncSGIS)
++#define glGetFragDataIndex MANGLE(GetFragDataIndex)
+ #define glGetFragDataLocationEXT MANGLE(GetFragDataLocationEXT)
+ #define glGetFragDataLocation MANGLE(GetFragDataLocation)
+ #define glGetFragmentLightfvSGIX MANGLE(GetFragmentLightfvSGIX)
+@@ -678,6 +700,8 @@
+ #define glGetNamedProgramLocalParameterIuivEXT MANGLE(GetNamedProgramLocalParameterIuivEXT)
+ #define glGetNamedProgramStringEXT MANGLE(GetNamedProgramStringEXT)
+ #define glGetNamedRenderbufferParameterivEXT MANGLE(GetNamedRenderbufferParameterivEXT)
++#define glGetNamedStringARB MANGLE(GetNamedStringARB)
++#define glGetNamedStringivARB MANGLE(GetNamedStringivARB)
+ #define glGetObjectBufferfvATI MANGLE(GetObjectBufferfvATI)
+ #define glGetObjectBufferivATI MANGLE(GetObjectBufferivATI)
+ #define glGetObjectParameterfvARB MANGLE(GetObjectParameterfvARB)
+@@ -717,18 +741,26 @@
+ #define glGetProgramParameterdvNV MANGLE(GetProgramParameterdvNV)
+ #define glGetProgramParameterfvNV MANGLE(GetProgramParameterfvNV)
+ #define glGetProgramRegisterfvMESA MANGLE(GetProgramRegisterfvMESA)
++#define glGetProgramStageiv MANGLE(GetProgramStageiv)
+ #define glGetProgramStringARB MANGLE(GetProgramStringARB)
+ #define glGetProgramStringNV MANGLE(GetProgramStringNV)
++#define glGetQueryIndexediv MANGLE(GetQueryIndexediv)
+ #define glGetQueryivARB MANGLE(GetQueryivARB)
+ #define glGetQueryiv MANGLE(GetQueryiv)
+ #define glGetQueryObjecti64vEXT MANGLE(GetQueryObjecti64vEXT)
++#define glGetQueryObjecti64v MANGLE(GetQueryObjecti64v)
+ #define glGetQueryObjectivARB MANGLE(GetQueryObjectivARB)
+ #define glGetQueryObjectiv MANGLE(GetQueryObjectiv)
+ #define glGetQueryObjectui64vEXT MANGLE(GetQueryObjectui64vEXT)
++#define glGetQueryObjectui64v MANGLE(GetQueryObjectui64v)
+ #define glGetQueryObjectuivARB MANGLE(GetQueryObjectuivARB)
+ #define glGetQueryObjectuiv MANGLE(GetQueryObjectuiv)
+ #define glGetRenderbufferParameterivEXT MANGLE(GetRenderbufferParameterivEXT)
+ #define glGetRenderbufferParameteriv MANGLE(GetRenderbufferParameteriv)
++#define glGetSamplerParameterfv MANGLE(GetSamplerParameterfv)
++#define glGetSamplerParameterIfv MANGLE(GetSamplerParameterIfv)
++#define glGetSamplerParameterIiv MANGLE(GetSamplerParameterIiv)
++#define glGetSamplerParameteriv MANGLE(GetSamplerParameteriv)
+ #define glGetSeparableFilterEXT MANGLE(GetSeparableFilterEXT)
+ #define glGetSeparableFilter MANGLE(GetSeparableFilter)
+ #define glGetShaderInfoLog MANGLE(GetShaderInfoLog)
+@@ -738,6 +770,8 @@
+ #define glGetSharpenTexFuncSGIS MANGLE(GetSharpenTexFuncSGIS)
+ #define glGetStringi MANGLE(GetStringi)
+ #define glGetString MANGLE(GetString)
++#define glGetSubroutineIndex MANGLE(GetSubroutineIndex)
++#define glGetSubroutineUniformLocation MANGLE(GetSubroutineUniformLocation)
+ #define glGetSynciv MANGLE(GetSynciv)
+ #define glGetTexBumpParameterfvATI MANGLE(GetTexBumpParameterfvATI)
+ #define glGetTexBumpParameterivATI MANGLE(GetTexBumpParameterivATI)
+@@ -770,6 +804,7 @@
+ #define glGetTransformFeedbackVaryingNV MANGLE(GetTransformFeedbackVaryingNV)
+ #define glGetUniformBlockIndex MANGLE(GetUniformBlockIndex)
+ #define glGetUniformBufferSizeEXT MANGLE(GetUniformBufferSizeEXT)
++#define glGetUniformdv MANGLE(GetUniformdv)
+ #define glGetUniformfvARB MANGLE(GetUniformfvARB)
+ #define glGetUniformfv MANGLE(GetUniformfv)
+ #define glGetUniformIndices MANGLE(GetUniformIndices)
+@@ -778,6 +813,7 @@
+ #define glGetUniformLocationARB MANGLE(GetUniformLocationARB)
+ #define glGetUniformLocation MANGLE(GetUniformLocation)
+ #define glGetUniformOffsetEXT MANGLE(GetUniformOffsetEXT)
++#define glGetUniformSubroutineuiv MANGLE(GetUniformSubroutineuiv)
+ #define glGetUniformui64vNV MANGLE(GetUniformui64vNV)
+ #define glGetUniformuivEXT MANGLE(GetUniformuivEXT)
+ #define glGetUniformuiv MANGLE(GetUniformuiv)
+@@ -865,6 +901,7 @@
+ #define glIsFramebuffer MANGLE(IsFramebuffer)
+ #define glIsList MANGLE(IsList)
+ #define glIsNamedBufferResidentNV MANGLE(IsNamedBufferResidentNV)
++#define glIsNamedStringARB MANGLE(IsNamedStringARB)
+ #define glIsObjectBufferATI MANGLE(IsObjectBufferATI)
+ #define glIsOcclusionQueryNV MANGLE(IsOcclusionQueryNV)
+ #define glIsProgramARB MANGLE(IsProgramARB)
+@@ -874,10 +911,12 @@
+ #define glIsQuery MANGLE(IsQuery)
+ #define glIsRenderbufferEXT MANGLE(IsRenderbufferEXT)
+ #define glIsRenderbuffer MANGLE(IsRenderbuffer)
++#define glIsSampler MANGLE(IsSampler)
+ #define glIsShader MANGLE(IsShader)
+ #define glIsSync MANGLE(IsSync)
+ #define glIsTextureEXT MANGLE(IsTextureEXT)
+ #define glIsTexture MANGLE(IsTexture)
++#define glIsTransformFeedback MANGLE(IsTransformFeedback)
+ #define glIsTransformFeedbackNV MANGLE(IsTransformFeedbackNV)
+ #define glIsVariantEnabledEXT MANGLE(IsVariantEnabledEXT)
+ #define glIsVertexArrayAPPLE MANGLE(IsVertexArrayAPPLE)
+@@ -915,6 +954,8 @@
+ #define glLogicOp MANGLE(LogicOp)
+ #define glMakeBufferNonResidentNV MANGLE(MakeBufferNonResidentNV)
+ #define glMakeBufferResidentNV MANGLE(MakeBufferResidentNV)
++#define glMakeNamedBufferNonResidentNV MANGLE(MakeNamedBufferNonResidentNV)
++#define glMakeNamedBufferResidentNV MANGLE(MakeNamedBufferResidentNV)
+ #define glMap1d MANGLE(Map1d)
+ #define glMap1f MANGLE(Map1f)
+ #define glMap2d MANGLE(Map2d)
+@@ -1048,6 +1089,14 @@
+ #define glMultiTexCoord4s MANGLE(MultiTexCoord4s)
+ #define glMultiTexCoord4svARB MANGLE(MultiTexCoord4svARB)
+ #define glMultiTexCoord4sv MANGLE(MultiTexCoord4sv)
++#define glMultiTexCoordP1ui MANGLE(MultiTexCoordP1ui)
++#define glMultiTexCoordP1uiv MANGLE(MultiTexCoordP1uiv)
++#define glMultiTexCoordP2ui MANGLE(MultiTexCoordP2ui)
++#define glMultiTexCoordP2uiv MANGLE(MultiTexCoordP2uiv)
++#define glMultiTexCoordP3ui MANGLE(MultiTexCoordP3ui)
++#define glMultiTexCoordP3uiv MANGLE(MultiTexCoordP3uiv)
++#define glMultiTexCoordP4ui MANGLE(MultiTexCoordP4ui)
++#define glMultiTexCoordP4uiv MANGLE(MultiTexCoordP4uiv)
+ #define glMultiTexCoordPointerEXT MANGLE(MultiTexCoordPointerEXT)
+ #define glMultiTexEnvfEXT MANGLE(MultiTexEnvfEXT)
+ #define glMultiTexEnvfvEXT MANGLE(MultiTexEnvfvEXT)
+@@ -1087,8 +1136,6 @@
+ #define glNamedFramebufferTextureEXT MANGLE(NamedFramebufferTextureEXT)
+ #define glNamedFramebufferTextureFaceEXT MANGLE(NamedFramebufferTextureFaceEXT)
+ #define glNamedFramebufferTextureLayerEXT MANGLE(NamedFramebufferTextureLayerEXT)
+-#define glNamedMakeBufferNonResidentNV MANGLE(NamedMakeBufferNonResidentNV)
+-#define glNamedMakeBufferResidentNV MANGLE(NamedMakeBufferResidentNV)
+ #define glNamedProgramLocalParameter4dEXT MANGLE(NamedProgramLocalParameter4dEXT)
+ #define glNamedProgramLocalParameter4dvEXT MANGLE(NamedProgramLocalParameter4dvEXT)
+ #define glNamedProgramLocalParameter4fEXT MANGLE(NamedProgramLocalParameter4fEXT)
+@@ -1104,6 +1151,7 @@
+ #define glNamedRenderbufferStorageEXT MANGLE(NamedRenderbufferStorageEXT)
+ #define glNamedRenderbufferStorageMultisampleCoverageEXT MANGLE(NamedRenderbufferStorageMultisampleCoverageEXT)
+ #define glNamedRenderbufferStorageMultisampleEXT MANGLE(NamedRenderbufferStorageMultisampleEXT)
++#define glNamedStringARB MANGLE(NamedStringARB)
+ #define glNewList MANGLE(NewList)
+ #define glNewObjectBufferATI MANGLE(NewObjectBufferATI)
+ #define glNormal3b MANGLE(Normal3b)
+@@ -1121,6 +1169,8 @@
+ #define glNormal3s MANGLE(Normal3s)
+ #define glNormal3sv MANGLE(Normal3sv)
+ #define glNormalFormatNV MANGLE(NormalFormatNV)
++#define glNormalP3ui MANGLE(NormalP3ui)
++#define glNormalP3uiv MANGLE(NormalP3uiv)
+ #define glNormalPointerEXT MANGLE(NormalPointerEXT)
+ #define glNormalPointerListIBM MANGLE(NormalPointerListIBM)
+ #define glNormalPointer MANGLE(NormalPointer)
+@@ -1140,6 +1190,9 @@
+ #define glOrtho MANGLE(Ortho)
+ #define glPassTexCoordATI MANGLE(PassTexCoordATI)
+ #define glPassThrough MANGLE(PassThrough)
++#define glPatchParameterfv MANGLE(PatchParameterfv)
++#define glPatchParameteri MANGLE(PatchParameteri)
++#define glPauseTransformFeedback MANGLE(PauseTransformFeedback)
+ #define glPauseTransformFeedbackNV MANGLE(PauseTransformFeedbackNV)
+ #define glPixelDataRangeNV MANGLE(PixelDataRangeNV)
+ #define glPixelMapfv MANGLE(PixelMapfv)
+@@ -1231,38 +1284,55 @@
+ #define glProgramParameters4dvNV MANGLE(ProgramParameters4dvNV)
+ #define glProgramParameters4fvNV MANGLE(ProgramParameters4fvNV)
+ #define glProgramStringARB MANGLE(ProgramStringARB)
++#define glProgramUniform1dEXT MANGLE(ProgramUniform1dEXT)
++#define glProgramUniform1dvEXT MANGLE(ProgramUniform1dvEXT)
+ #define glProgramUniform1fEXT MANGLE(ProgramUniform1fEXT)
+ #define glProgramUniform1fvEXT MANGLE(ProgramUniform1fvEXT)
+ #define glProgramUniform1iEXT MANGLE(ProgramUniform1iEXT)
+ #define glProgramUniform1ivEXT MANGLE(ProgramUniform1ivEXT)
+ #define glProgramUniform1uiEXT MANGLE(ProgramUniform1uiEXT)
+ #define glProgramUniform1uivEXT MANGLE(ProgramUniform1uivEXT)
++#define glProgramUniform2dEXT MANGLE(ProgramUniform2dEXT)
++#define glProgramUniform2dvEXT MANGLE(ProgramUniform2dvEXT)
+ #define glProgramUniform2fEXT MANGLE(ProgramUniform2fEXT)
+ #define glProgramUniform2fvEXT MANGLE(ProgramUniform2fvEXT)
+ #define glProgramUniform2iEXT MANGLE(ProgramUniform2iEXT)
+ #define glProgramUniform2ivEXT MANGLE(ProgramUniform2ivEXT)
+ #define glProgramUniform2uiEXT MANGLE(ProgramUniform2uiEXT)
+ #define glProgramUniform2uivEXT MANGLE(ProgramUniform2uivEXT)
++#define glProgramUniform3dEXT MANGLE(ProgramUniform3dEXT)
++#define glProgramUniform3dvEXT MANGLE(ProgramUniform3dvEXT)
+ #define glProgramUniform3fEXT MANGLE(ProgramUniform3fEXT)
+ #define glProgramUniform3fvEXT MANGLE(ProgramUniform3fvEXT)
+ #define glProgramUniform3iEXT MANGLE(ProgramUniform3iEXT)
+ #define glProgramUniform3ivEXT MANGLE(ProgramUniform3ivEXT)
+ #define glProgramUniform3uiEXT MANGLE(ProgramUniform3uiEXT)
+ #define glProgramUniform3uivEXT MANGLE(ProgramUniform3uivEXT)
++#define glProgramUniform4dEXT MANGLE(ProgramUniform4dEXT)
++#define glProgramUniform4dvEXT MANGLE(ProgramUniform4dvEXT)
+ #define glProgramUniform4fEXT MANGLE(ProgramUniform4fEXT)
+ #define glProgramUniform4fvEXT MANGLE(ProgramUniform4fvEXT)
+ #define glProgramUniform4iEXT MANGLE(ProgramUniform4iEXT)
+ #define glProgramUniform4ivEXT MANGLE(ProgramUniform4ivEXT)
+ #define glProgramUniform4uiEXT MANGLE(ProgramUniform4uiEXT)
+ #define glProgramUniform4uivEXT MANGLE(ProgramUniform4uivEXT)
++#define glProgramUniformMatrix2dvEXT MANGLE(ProgramUniformMatrix2dvEXT)
+ #define glProgramUniformMatrix2fvEXT MANGLE(ProgramUniformMatrix2fvEXT)
++#define glProgramUniformMatrix2x3dvEXT MANGLE(ProgramUniformMatrix2x3dvEXT)
+ #define glProgramUniformMatrix2x3fvEXT MANGLE(ProgramUniformMatrix2x3fvEXT)
++#define glProgramUniformMatrix2x4dvEXT MANGLE(ProgramUniformMatrix2x4dvEXT)
+ #define glProgramUniformMatrix2x4fvEXT MANGLE(ProgramUniformMatrix2x4fvEXT)
++#define glProgramUniformMatrix3dvEXT MANGLE(ProgramUniformMatrix3dvEXT)
+ #define glProgramUniformMatrix3fvEXT MANGLE(ProgramUniformMatrix3fvEXT)
++#define glProgramUniformMatrix3x2dvEXT MANGLE(ProgramUniformMatrix3x2dvEXT)
+ #define glProgramUniformMatrix3x2fvEXT MANGLE(ProgramUniformMatrix3x2fvEXT)
++#define glProgramUniformMatrix3x4dvEXT MANGLE(ProgramUniformMatrix3x4dvEXT)
+ #define glProgramUniformMatrix3x4fvEXT MANGLE(ProgramUniformMatrix3x4fvEXT)
++#define glProgramUniformMatrix4dvEXT MANGLE(ProgramUniformMatrix4dvEXT)
+ #define glProgramUniformMatrix4fvEXT MANGLE(ProgramUniformMatrix4fvEXT)
++#define glProgramUniformMatrix4x2dvEXT MANGLE(ProgramUniformMatrix4x2dvEXT)
+ #define glProgramUniformMatrix4x2fvEXT MANGLE(ProgramUniformMatrix4x2fvEXT)
++#define glProgramUniformMatrix4x3dvEXT MANGLE(ProgramUniformMatrix4x3dvEXT)
+ #define glProgramUniformMatrix4x3fvEXT MANGLE(ProgramUniformMatrix4x3fvEXT)
+ #define glProgramUniformui64NV MANGLE(ProgramUniformui64NV)
+ #define glProgramUniformui64vNV MANGLE(ProgramUniformui64vNV)
+@@ -1274,6 +1344,7 @@
+ #define glPushClientAttrib MANGLE(PushClientAttrib)
+ #define glPushMatrix MANGLE(PushMatrix)
+ #define glPushName MANGLE(PushName)
++#define glQueryCounter MANGLE(QueryCounter)
+ #define glRasterPos2d MANGLE(RasterPos2d)
+ #define glRasterPos2dv MANGLE(RasterPos2dv)
+ #define glRasterPos2f MANGLE(RasterPos2f)
+@@ -1345,6 +1416,7 @@
+ #define glResetMinmaxEXT MANGLE(ResetMinmaxEXT)
+ #define glResetMinmax MANGLE(ResetMinmax)
+ #define glResizeBuffersMESA MANGLE(ResizeBuffersMESA)
++#define glResumeTransformFeedback MANGLE(ResumeTransformFeedback)
+ #define glResumeTransformFeedbackNV MANGLE(ResumeTransformFeedbackNV)
+ #define glRotated MANGLE(Rotated)
+ #define glRotatef MANGLE(Rotatef)
+@@ -1357,6 +1429,12 @@
+ #define glSampleMaskSGIS MANGLE(SampleMaskSGIS)
+ #define glSamplePatternEXT MANGLE(SamplePatternEXT)
+ #define glSamplePatternSGIS MANGLE(SamplePatternSGIS)
++#define glSamplerParameterf MANGLE(SamplerParameterf)
++#define glSamplerParameterfv MANGLE(SamplerParameterfv)
++#define glSamplerParameterIiv MANGLE(SamplerParameterIiv)
++#define glSamplerParameteri MANGLE(SamplerParameteri)
++#define glSamplerParameterIuiv MANGLE(SamplerParameterIuiv)
++#define glSamplerParameteriv MANGLE(SamplerParameteriv)
+ #define glScaled MANGLE(Scaled)
+ #define glScalef MANGLE(Scalef)
+ #define glScissor MANGLE(Scissor)
+@@ -1395,6 +1473,8 @@
+ #define glSecondaryColor3usvEXT MANGLE(SecondaryColor3usvEXT)
+ #define glSecondaryColor3usv MANGLE(SecondaryColor3usv)
+ #define glSecondaryColorFormatNV MANGLE(SecondaryColorFormatNV)
++#define glSecondaryColorP3ui MANGLE(SecondaryColorP3ui)
++#define glSecondaryColorP3uiv MANGLE(SecondaryColorP3uiv)
+ #define glSecondaryColorPointerEXT MANGLE(SecondaryColorPointerEXT)
+ #define glSecondaryColorPointerListIBM MANGLE(SecondaryColorPointerListIBM)
+ #define glSecondaryColorPointer MANGLE(SecondaryColorPointer)
+@@ -1509,6 +1589,14 @@
+ #define glTexCoord4s MANGLE(TexCoord4s)
+ #define glTexCoord4sv MANGLE(TexCoord4sv)
+ #define glTexCoordFormatNV MANGLE(TexCoordFormatNV)
++#define glTexCoordP1ui MANGLE(TexCoordP1ui)
++#define glTexCoordP1uiv MANGLE(TexCoordP1uiv)
++#define glTexCoordP2ui MANGLE(TexCoordP2ui)
++#define glTexCoordP2uiv MANGLE(TexCoordP2uiv)
++#define glTexCoordP3ui MANGLE(TexCoordP3ui)
++#define glTexCoordP3uiv MANGLE(TexCoordP3uiv)
++#define glTexCoordP4ui MANGLE(TexCoordP4ui)
++#define glTexCoordP4uiv MANGLE(TexCoordP4uiv)
+ #define glTexCoordPointerEXT MANGLE(TexCoordPointerEXT)
+ #define glTexCoordPointerListIBM MANGLE(TexCoordPointerListIBM)
+ #define glTexCoordPointer MANGLE(TexCoordPointer)
+@@ -1574,6 +1662,8 @@
+ #define glTransformFeedbackVaryingsNV MANGLE(TransformFeedbackVaryingsNV)
+ #define glTranslated MANGLE(Translated)
+ #define glTranslatef MANGLE(Translatef)
++#define glUniform1d MANGLE(Uniform1d)
++#define glUniform1dv MANGLE(Uniform1dv)
+ #define glUniform1fARB MANGLE(Uniform1fARB)
+ #define glUniform1f MANGLE(Uniform1f)
+ #define glUniform1fvARB MANGLE(Uniform1fvARB)
+@@ -1586,6 +1676,8 @@
+ #define glUniform1ui MANGLE(Uniform1ui)
+ #define glUniform1uivEXT MANGLE(Uniform1uivEXT)
+ #define glUniform1uiv MANGLE(Uniform1uiv)
++#define glUniform2d MANGLE(Uniform2d)
++#define glUniform2dv MANGLE(Uniform2dv)
+ #define glUniform2fARB MANGLE(Uniform2fARB)
+ #define glUniform2f MANGLE(Uniform2f)
+ #define glUniform2fvARB MANGLE(Uniform2fvARB)
+@@ -1598,6 +1690,8 @@
+ #define glUniform2ui MANGLE(Uniform2ui)
+ #define glUniform2uivEXT MANGLE(Uniform2uivEXT)
+ #define glUniform2uiv MANGLE(Uniform2uiv)
++#define glUniform3d MANGLE(Uniform3d)
++#define glUniform3dv MANGLE(Uniform3dv)
+ #define glUniform3fARB MANGLE(Uniform3fARB)
+ #define glUniform3f MANGLE(Uniform3f)
+ #define glUniform3fvARB MANGLE(Uniform3fvARB)
+@@ -1610,6 +1704,8 @@
+ #define glUniform3ui MANGLE(Uniform3ui)
+ #define glUniform3uivEXT MANGLE(Uniform3uivEXT)
+ #define glUniform3uiv MANGLE(Uniform3uiv)
++#define glUniform4d MANGLE(Uniform4d)
++#define glUniform4dv MANGLE(Uniform4dv)
+ #define glUniform4fARB MANGLE(Uniform4fARB)
+ #define glUniform4f MANGLE(Uniform4f)
+ #define glUniform4fvARB MANGLE(Uniform4fvARB)
+@@ -1624,18 +1720,28 @@
+ #define glUniform4uiv MANGLE(Uniform4uiv)
+ #define glUniformBlockBinding MANGLE(UniformBlockBinding)
+ #define glUniformBufferEXT MANGLE(UniformBufferEXT)
++#define glUniformMatrix2dv MANGLE(UniformMatrix2dv)
+ #define glUniformMatrix2fvARB MANGLE(UniformMatrix2fvARB)
+ #define glUniformMatrix2fv MANGLE(UniformMatrix2fv)
++#define glUniformMatrix2x3dv MANGLE(UniformMatrix2x3dv)
+ #define glUniformMatrix2x3fv MANGLE(UniformMatrix2x3fv)
++#define glUniformMatrix2x4dv MANGLE(UniformMatrix2x4dv)
+ #define glUniformMatrix2x4fv MANGLE(UniformMatrix2x4fv)
++#define glUniformMatrix3dv MANGLE(UniformMatrix3dv)
+ #define glUniformMatrix3fvARB MANGLE(UniformMatrix3fvARB)
+ #define glUniformMatrix3fv MANGLE(UniformMatrix3fv)
++#define glUniformMatrix3x2dv MANGLE(UniformMatrix3x2dv)
+ #define glUniformMatrix3x2fv MANGLE(UniformMatrix3x2fv)
++#define glUniformMatrix3x4dv MANGLE(UniformMatrix3x4dv)
+ #define glUniformMatrix3x4fv MANGLE(UniformMatrix3x4fv)
++#define glUniformMatrix4dv MANGLE(UniformMatrix4dv)
+ #define glUniformMatrix4fvARB MANGLE(UniformMatrix4fvARB)
+ #define glUniformMatrix4fv MANGLE(UniformMatrix4fv)
++#define glUniformMatrix4x2dv MANGLE(UniformMatrix4x2dv)
+ #define glUniformMatrix4x2fv MANGLE(UniformMatrix4x2fv)
++#define glUniformMatrix4x3dv MANGLE(UniformMatrix4x3dv)
+ #define glUniformMatrix4x3fv MANGLE(UniformMatrix4x3fv)
++#define glUniformSubroutinesuiv MANGLE(UniformSubroutinesuiv)
+ #define glUniformui64NV MANGLE(Uniformui64NV)
+ #define glUniformui64vNV MANGLE(Uniformui64vNV)
+ #define glUnlockArraysEXT MANGLE(UnlockArraysEXT)
+@@ -1844,6 +1950,14 @@
+ #define glVertexAttribIFormatNV MANGLE(VertexAttribIFormatNV)
+ #define glVertexAttribIPointerEXT MANGLE(VertexAttribIPointerEXT)
+ #define glVertexAttribIPointer MANGLE(VertexAttribIPointer)
++#define glVertexAttribP1ui MANGLE(VertexAttribP1ui)
++#define glVertexAttribP1uiv MANGLE(VertexAttribP1uiv)
++#define glVertexAttribP2ui MANGLE(VertexAttribP2ui)
++#define glVertexAttribP2uiv MANGLE(VertexAttribP2uiv)
++#define glVertexAttribP3ui MANGLE(VertexAttribP3ui)
++#define glVertexAttribP3uiv MANGLE(VertexAttribP3uiv)
++#define glVertexAttribP4ui MANGLE(VertexAttribP4ui)
++#define glVertexAttribP4uiv MANGLE(VertexAttribP4uiv)
+ #define glVertexAttribPointerARB MANGLE(VertexAttribPointerARB)
+ #define glVertexAttribPointer MANGLE(VertexAttribPointer)
+ #define glVertexAttribPointerNV MANGLE(VertexAttribPointerNV)
+@@ -1868,6 +1982,12 @@
+ #define glVertexBlendEnvfATI MANGLE(VertexBlendEnvfATI)
+ #define glVertexBlendEnviATI MANGLE(VertexBlendEnviATI)
+ #define glVertexFormatNV MANGLE(VertexFormatNV)
++#define glVertexP2ui MANGLE(VertexP2ui)
++#define glVertexP2uiv MANGLE(VertexP2uiv)
++#define glVertexP3ui MANGLE(VertexP3ui)
++#define glVertexP3uiv MANGLE(VertexP3uiv)
++#define glVertexP4ui MANGLE(VertexP4ui)
++#define glVertexP4uiv MANGLE(VertexP4uiv)
+ #define glVertexPointerEXT MANGLE(VertexPointerEXT)
+ #define glVertexPointerListIBM MANGLE(VertexPointerListIBM)
+ #define glVertexPointer MANGLE(VertexPointer)
+diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
+index 3d0455d..db7bf17 100644
+--- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c
++++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
+@@ -1489,6 +1489,12 @@ const struct tgsi_token *ureg_get_tokens( struct ureg_program *ureg,
+ }
+
+
++void ureg_free_tokens( const struct tgsi_token *tokens )
++{
++ FREE((struct tgsi_token *)tokens);
++}
++
++
+ struct ureg_program *ureg_create( unsigned processor )
+ {
+ struct ureg_program *ureg = CALLOC_STRUCT( ureg_program );
+diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.h b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
+index 0130a77..8302d1b 100644
+--- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h
++++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
+@@ -104,6 +104,10 @@ ureg_get_tokens( struct ureg_program *ureg,
+ unsigned *nr_tokens );
+
+
++/* Free the tokens created by ureg_get_tokens() */
++void ureg_free_tokens( const struct tgsi_token *tokens );
++
++
+ void
+ ureg_destroy( struct ureg_program * );
+
+diff --git a/src/gallium/state_trackers/egl/x11/glxinit.c b/src/gallium/state_trackers/egl/x11/glxinit.c
+index 1ed2afd..dd35189 100644
+--- a/src/gallium/state_trackers/egl/x11/glxinit.c
++++ b/src/gallium/state_trackers/egl/x11/glxinit.c
+@@ -16,6 +16,8 @@
+
+ #include "glxinit.h"
+
++#ifdef GLX_DIRECT_RENDERING
++
+ typedef struct GLXGenericGetString
+ {
+ CARD8 reqType;
+@@ -680,3 +682,5 @@ __glXInitialize(Display * dpy)
+
+ return dpyPriv;
+ }
++
++#endif /* GLX_DIRECT_RENDERING */
+diff --git a/src/gallium/state_trackers/egl/x11/native_dri2.c b/src/gallium/state_trackers/egl/x11/native_dri2.c
+index 8d2a8b1..a8bdd34 100644
+--- a/src/gallium/state_trackers/egl/x11/native_dri2.c
++++ b/src/gallium/state_trackers/egl/x11/native_dri2.c
+@@ -37,6 +37,8 @@
+ #include "native_x11.h"
+ #include "x11_screen.h"
+
++#ifdef GLX_DIRECT_RENDERING
++
+ enum dri2_surface_type {
+ DRI2_SURFACE_TYPE_WINDOW,
+ DRI2_SURFACE_TYPE_PIXMAP,
+@@ -878,3 +880,15 @@ x11_create_dri2_display(EGLNativeDisplayType dpy,
+
+ return &dri2dpy->base;
+ }
++
++#else /* GLX_DIRECT_RENDERING */
++
++struct native_display *
++x11_create_dri2_display(EGLNativeDisplayType dpy,
++ struct native_event_handler *event_handler,
++ struct drm_api *api)
++{
++ return NULL;
++}
++
++#endif /* GLX_DIRECT_RENDERING */
+diff --git a/src/gallium/state_trackers/egl/x11/native_x11.c b/src/gallium/state_trackers/egl/x11/native_x11.c
+index 7b4fe63..0c25e4d 100644
+--- a/src/gallium/state_trackers/egl/x11/native_x11.c
++++ b/src/gallium/state_trackers/egl/x11/native_x11.c
+@@ -70,7 +70,9 @@ native_create_probe(EGLNativeDisplayType dpy)
+ xscr = x11_screen_create(xdpy, scr);
+ if (xscr) {
+ if (x11_screen_support(xscr, X11_SCREEN_EXTENSION_DRI2)) {
++#ifdef GLX_DIRECT_RENDERING
+ driver_name = x11_screen_probe_dri2(xscr, NULL, NULL);
++#endif
+ if (driver_name)
+ nprobe->data = strdup(driver_name);
+ }
+diff --git a/src/gallium/state_trackers/egl/x11/x11_screen.c b/src/gallium/state_trackers/egl/x11/x11_screen.c
+index f409611..1706120 100644
+--- a/src/gallium/state_trackers/egl/x11/x11_screen.c
++++ b/src/gallium/state_trackers/egl/x11/x11_screen.c
+@@ -39,8 +39,10 @@
+ #include "glxinit.h"
+
+ struct x11_screen {
++#ifdef GLX_DIRECT_RENDERING
+ /* dummy base class */
+ struct __GLXDRIdisplayRec base;
++#endif
+
+ Display *dpy;
+ int number;
+@@ -103,15 +105,19 @@ x11_screen_destroy(struct x11_screen *xscr)
+ if (xscr->dri_device)
+ Xfree(xscr->dri_device);
+
++#ifdef GLX_DIRECT_RENDERING
+ /* xscr->glx_dpy will be destroyed with the X display */
+ if (xscr->glx_dpy)
+ xscr->glx_dpy->dri2Display = NULL;
++#endif
+
+ if (xscr->visuals)
+ XFree(xscr->visuals);
+ free(xscr);
+ }
+
++#ifdef GLX_DIRECT_RENDERING
++
+ static boolean
+ x11_screen_init_dri2(struct x11_screen *xscr)
+ {
+@@ -133,6 +139,8 @@ x11_screen_init_glx(struct x11_screen *xscr)
+ return (xscr->glx_dpy != NULL);
+ }
+
++#endif /* GLX_DIRECT_RENDERING */
++
+ /**
+ * Return true if the screen supports the extension.
+ */
+@@ -145,12 +153,14 @@ x11_screen_support(struct x11_screen *xscr, enum x11_screen_extension ext)
+ case X11_SCREEN_EXTENSION_XSHM:
+ supported = XShmQueryExtension(xscr->dpy);
+ break;
++#ifdef GLX_DIRECT_RENDERING
+ case X11_SCREEN_EXTENSION_GLX:
+ supported = x11_screen_init_glx(xscr);
+ break;
+ case X11_SCREEN_EXTENSION_DRI2:
+ supported = x11_screen_init_dri2(xscr);
+ break;
++#endif
+ default:
+ break;
+ }
+@@ -234,6 +244,39 @@ x11_screen_convert_visual(struct x11_screen *xscr, const XVisualInfo *visual,
+ }
+
+ /**
++ * Return the depth of a drawable.
++ *
++ * Unlike other drawable functions, the drawable needs not be a DRI2 drawable.
++ */
++uint
++x11_drawable_get_depth(struct x11_screen *xscr, Drawable drawable)
++{
++ unsigned int depth;
++
++ if (drawable != xscr->last_drawable) {
++ Window root;
++ int x, y;
++ unsigned int w, h, border;
++ Status ok;
++
++ ok = XGetGeometry(xscr->dpy, drawable, &root,
++ &x, &y, &w, &h, &border, &depth);
++ if (!ok)
++ depth = 0;
++
++ xscr->last_drawable = drawable;
++ xscr->last_depth = depth;
++ }
++ else {
++ depth = xscr->last_depth;
++ }
++
++ return depth;
++}
++
++#ifdef GLX_DIRECT_RENDERING
++
++/**
+ * Return the GLX fbconfigs.
+ */
+ const __GLcontextModes *
+@@ -392,37 +435,6 @@ x11_drawable_get_buffers(struct x11_screen *xscr, Drawable drawable,
+ }
+
+ /**
+- * Return the depth of a drawable.
+- *
+- * Unlike other drawable functions, the drawable needs not be a DRI2 drawable.
+- */
+-uint
+-x11_drawable_get_depth(struct x11_screen *xscr, Drawable drawable)
+-{
+- unsigned int depth;
+-
+- if (drawable != xscr->last_drawable) {
+- Window root;
+- int x, y;
+- unsigned int w, h, border;
+- Status ok;
+-
+- ok = XGetGeometry(xscr->dpy, drawable, &root,
+- &x, &y, &w, &h, &border, &depth);
+- if (!ok)
+- depth = 0;
+-
+- xscr->last_drawable = drawable;
+- xscr->last_depth = depth;
+- }
+- else {
+- depth = xscr->last_depth;
+- }
+-
+- return depth;
+-}
+-
+-/**
+ * Create a mode list of the given size.
+ */
+ __GLcontextModes *
+@@ -489,3 +501,5 @@ dri2InvalidateBuffers(Display *dpy, XID drawable)
+
+ xscr->dri_invalidate_buffers(xscr, drawable, xscr->dri_user_data);
+ }
++
++#endif /* GLX_DIRECT_RENDERING */
+diff --git a/src/gallium/state_trackers/egl/x11/x11_screen.h b/src/gallium/state_trackers/egl/x11/x11_screen.h
+index 37e8d5a..55e1201 100644
+--- a/src/gallium/state_trackers/egl/x11/x11_screen.h
++++ b/src/gallium/state_trackers/egl/x11/x11_screen.h
+@@ -68,20 +68,18 @@ void
+ x11_screen_convert_visual(struct x11_screen *xscr, const XVisualInfo *visual,
+ __GLcontextModes *mode);
+
++uint
++x11_drawable_get_depth(struct x11_screen *xscr, Drawable drawable);
++
++#ifdef GLX_DIRECT_RENDERING
++
++/* GLX */
+ const __GLcontextModes *
+ x11_screen_get_glx_configs(struct x11_screen *xscr);
+
+ const __GLcontextModes *
+ x11_screen_get_glx_visuals(struct x11_screen *xscr);
+
+-const char *
+-x11_screen_probe_dri2(struct x11_screen *xscr, int *major, int *minor);
+-
+-int
+-x11_screen_enable_dri2(struct x11_screen *xscr,
+- x11_drawable_invalidate_buffers invalidate_buffers,
+- void *user_data);
+-
+ __GLcontextModes *
+ x11_context_modes_create(unsigned count);
+
+@@ -91,6 +89,15 @@ x11_context_modes_destroy(__GLcontextModes *modes);
+ unsigned
+ x11_context_modes_count(const __GLcontextModes *modes);
+
++/* DRI2 */
++const char *
++x11_screen_probe_dri2(struct x11_screen *xscr, int *major, int *minor);
++
++int
++x11_screen_enable_dri2(struct x11_screen *xscr,
++ x11_drawable_invalidate_buffers invalidate_buffers,
++ void *user_data);
++
+ void
+ x11_drawable_enable_dri2(struct x11_screen *xscr,
+ Drawable drawable, boolean on);
+@@ -105,7 +112,6 @@ x11_drawable_get_buffers(struct x11_screen *xscr, Drawable drawable,
+ int *width, int *height, unsigned int *attachments,
+ boolean with_format, int num_ins, int *num_outs);
+
+-uint
+-x11_drawable_get_depth(struct x11_screen *xscr, Drawable drawable);
++#endif /* GLX_DIRECT_RENDERING */
+
+ #endif /* _X11_SCREEN_H_ */
+diff --git a/src/gallium/winsys/drm/Makefile.egl b/src/gallium/winsys/drm/Makefile.egl
+index 8363de6..c48967f 100644
+--- a/src/gallium/winsys/drm/Makefile.egl
++++ b/src/gallium/winsys/drm/Makefile.egl
+@@ -11,7 +11,7 @@
+
+ EGL_DRIVER_OBJECTS = $(EGL_DRIVER_SOURCES:.c=.o)
+
+-common_LIBS = -ldrm -lm -ldl
++common_LIBS = -ldrm -lm $(DLOPEN_LIBS)
+
+ x11_ST = $(TOP)/src/gallium/state_trackers/egl/libeglx11.a
+ x11_LIBS = $(common_LIBS) -lX11 -lXext -lXfixes
+diff --git a/src/glw/Makefile b/src/glw/Makefile
+index 1fb3d3c..39352f0 100644
+--- a/src/glw/Makefile
++++ b/src/glw/Makefile
+@@ -17,7 +17,7 @@ OBJECTS = $(GLW_SOURCES:.c=.o)
+ ##### RULES #####
+
+ .c.o:
+- $(CC) -c $(INCDIRS) $(CFLAGS) $<
++ $(CC) -c $(INCDIRS) $(CFLAGS) $(GLW_CFLAGS) $<
+
+
+
+diff --git a/src/mesa/drivers/dri/r300/compiler/radeon_pair_schedule.c b/src/mesa/drivers/dri/r300/compiler/radeon_pair_schedule.c
+index df67aaf..b8ee288 100644
+--- a/src/mesa/drivers/dri/r300/compiler/radeon_pair_schedule.c
++++ b/src/mesa/drivers/dri/r300/compiler/radeon_pair_schedule.c
+@@ -141,12 +141,28 @@ static void add_inst_to_list(struct schedule_instruction ** list, struct schedul
+ *list = inst;
+ }
+
++static void add_inst_to_list_end(struct schedule_instruction ** list,
++ struct schedule_instruction * inst)
++{
++ if(!*list){
++ *list = inst;
++ }else{
++ struct schedule_instruction * temp = *list;
++ while(temp->NextReady){
++ temp = temp->NextReady;
++ }
++ temp->NextReady = inst;
++ }
++}
++
+ static void instruction_ready(struct schedule_state * s, struct schedule_instruction * sinst)
+ {
+ DBG("%i is now ready\n", sinst->Instruction->IP);
+
++ /* Adding Ready TEX instructions to the end of the "Ready List" helps
++ * us emit TEX instructions in blocks without losing our place. */
+ if (sinst->Instruction->Type == RC_INSTRUCTION_NORMAL)
+- add_inst_to_list(&s->ReadyTEX, sinst);
++ add_inst_to_list_end(&s->ReadyTEX, sinst);
+ else if (sinst->Instruction->U.P.Alpha.Opcode == RC_OPCODE_NOP)
+ add_inst_to_list(&s->ReadyRGB, sinst);
+ else if (sinst->Instruction->U.P.RGB.Opcode == RC_OPCODE_NOP)
+@@ -163,11 +179,14 @@ static void decrease_dependencies(struct schedule_state * s, struct schedule_ins
+ instruction_ready(s, sinst);
+ }
+
+-static void commit_instruction(struct schedule_state * s, struct schedule_instruction * sinst)
+-{
+- DBG("%i: commit\n", sinst->Instruction->IP);
+-
+- for(unsigned int i = 0; i < sinst->NumReadValues; ++i) {
++/**
++ * This function decreases the dependencies of the next instruction that
++ * wants to write to each of sinst's read values.
++ */
++static void commit_update_reads(struct schedule_state * s,
++ struct schedule_instruction * sinst){
++ unsigned int i;
++ for(i = 0; i < sinst->NumReadValues; ++i) {
+ struct reg_value * v = sinst->ReadValues[i];
+ assert(v->NumReaders > 0);
+ v->NumReaders--;
+@@ -176,8 +195,12 @@ static void commit_instruction(struct schedule_state * s, struct schedule_instru
+ decrease_dependencies(s, v->Next->Writer);
+ }
+ }
++}
+
+- for(unsigned int i = 0; i < sinst->NumWriteValues; ++i) {
++static void commit_update_writes(struct schedule_state * s,
++ struct schedule_instruction * sinst){
++ unsigned int i;
++ for(i = 0; i < sinst->NumWriteValues; ++i) {
+ struct reg_value * v = sinst->WriteValues[i];
+ if (v->NumReaders) {
+ for(struct reg_value_reader * r = v->Readers; r; r = r->Next) {
+@@ -196,6 +219,15 @@ static void commit_instruction(struct schedule_state * s, struct schedule_instru
+ }
+ }
+
++static void commit_alu_instruction(struct schedule_state * s, struct schedule_instruction * sinst)
++{
++ DBG("%i: commit\n", sinst->Instruction->IP);
++
++ commit_update_reads(s, sinst);
++
++ commit_update_writes(s, sinst);
++}
++
+ /**
+ * Emit all ready texture instructions in a single block.
+ *
+@@ -208,21 +240,37 @@ static void emit_all_tex(struct schedule_state * s, struct rc_instruction * befo
+
+ assert(s->ReadyTEX);
+
+- /* Don't let the ready list change under us! */
+- readytex = s->ReadyTEX;
+- s->ReadyTEX = 0;
+-
+ /* Node marker for R300 */
+ struct rc_instruction * inst_begin = rc_insert_new_instruction(s->C, before->Prev);
+ inst_begin->U.I.Opcode = RC_OPCODE_BEGIN_TEX;
+
+ /* Link texture instructions back in */
++ readytex = s->ReadyTEX;
+ while(readytex) {
+- struct schedule_instruction * tex = readytex;
++ rc_insert_instruction(before->Prev, readytex->Instruction);
++ DBG("%i: commit TEX reads\n", readytex->Instruction->IP);
++
++ /* All of the TEX instructions in the same TEX block have
++ * their source registers read from before any of the
++ * instructions in that block write to their destination
++ * registers. This means that when we commit a TEX
++ * instruction, any other TEX instruction that wants to write
++ * to one of the committed instruction's source register can be
++ * marked as ready and should be emitted in the same TEX
++ * block. This prevents the following sequence from being
++ * emitted in two different TEX blocks:
++ * 0: TEX temp[0].xyz, temp[1].xy__, 2D[0];
++ * 1: TEX temp[1].xyz, temp[2].xy__, 2D[0];
++ */
++ commit_update_reads(s, readytex);
++ readytex = readytex->NextReady;
++ }
++ readytex = s->ReadyTEX;
++ s->ReadyTEX = 0;
++ while(readytex){
++ DBG("%i: commit TEX writes\n", readytex->Instruction->IP);
++ commit_update_writes(s, readytex);
+ readytex = readytex->NextReady;
+-
+- rc_insert_instruction(before->Prev, tex->Instruction);
+- commit_instruction(s, tex);
+ }
+ }
+
+@@ -328,7 +376,7 @@ static void emit_one_alu(struct schedule_state *s, struct rc_instruction * befor
+ }
+
+ rc_insert_instruction(before->Prev, sinst->Instruction);
+- commit_instruction(s, sinst);
++ commit_alu_instruction(s, sinst);
+ } else {
+ struct schedule_instruction **prgb;
+ struct schedule_instruction **palpha;
+@@ -346,8 +394,8 @@ static void emit_one_alu(struct schedule_state *s, struct rc_instruction * befor
+ *prgb = (*prgb)->NextReady;
+ *palpha = (*palpha)->NextReady;
+ rc_insert_instruction(before->Prev, psirgb->Instruction);
+- commit_instruction(s, psirgb);
+- commit_instruction(s, psialpha);
++ commit_alu_instruction(s, psirgb);
++ commit_alu_instruction(s, psialpha);
+ goto success;
+ }
+ }
+@@ -357,7 +405,7 @@ static void emit_one_alu(struct schedule_state *s, struct rc_instruction * befor
+ s->ReadyRGB = s->ReadyRGB->NextReady;
+
+ rc_insert_instruction(before->Prev, sinst->Instruction);
+- commit_instruction(s, sinst);
++ commit_alu_instruction(s, sinst);
+ success: ;
+ }
+ }
+diff --git a/src/mesa/drivers/dri/r300/r300_context.c b/src/mesa/drivers/dri/r300/r300_context.c
+index 689bb13..4cbd4f2 100644
+--- a/src/mesa/drivers/dri/r300/r300_context.c
++++ b/src/mesa/drivers/dri/r300/r300_context.c
+@@ -456,7 +456,7 @@ static void r300InitGLExtensions(GLcontext *ctx)
+ if (!r300->radeon.radeonScreen->drmSupportsOcclusionQueries) {
+ _mesa_disable_extension(ctx, "GL_ARB_occlusion_query");
+ }
+- if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV350)
++ if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_R420)
+ _mesa_enable_extension(ctx, "GL_ARB_half_float_vertex");
+
+ if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515)
+diff --git a/src/mesa/drivers/dri/r300/r300_draw.c b/src/mesa/drivers/dri/r300/r300_draw.c
+index 282c0e1..5ae9f49 100644
+--- a/src/mesa/drivers/dri/r300/r300_draw.c
++++ b/src/mesa/drivers/dri/r300/r300_draw.c
+@@ -523,8 +523,7 @@ static void r300AllocDmaRegions(GLcontext *ctx, const struct gl_client_array *in
+ r300ConvertAttrib(ctx, count, input[i], &vbuf->attribs[index]);
+ } else {
+ if (input[i]->BufferObj->Name) {
+- if (stride % 4 != 0) {
+- assert(((intptr_t) input[i]->Ptr) % input[i]->StrideB == 0);
++ if (stride % 4 != 0 || (intptr_t)input[i]->Ptr % 4 != 0) {
+ r300AlignDataToDword(ctx, input[i], count, &vbuf->attribs[index]);
+ vbuf->attribs[index].is_named_bo = GL_FALSE;
+ } else {
+diff --git a/src/mesa/drivers/dri/r600/r700_assembler.c b/src/mesa/drivers/dri/r600/r700_assembler.c
+index 834bcc6..7b957fb 100644
+--- a/src/mesa/drivers/dri/r600/r700_assembler.c
++++ b/src/mesa/drivers/dri/r600/r700_assembler.c
+@@ -293,7 +293,9 @@ GLuint GetSurfaceFormat(GLenum eType, GLuint nChannels, GLuint * pClient_size)
+ case 2:
+ format = FMT_16_16; break;
+ case 3:
+- format = FMT_16_16_16; break;
++ /* 3 comp GL_SHORT vertex format doesnt work on r700
++ 4 somehow works, test - sauerbraten */
++ format = FMT_16_16_16_16; break;
+ case 4:
+ format = FMT_16_16_16_16; break;
+ default:
+@@ -1051,6 +1053,67 @@ void checkop_init(r700_AssemblerBase* pAsm)
+ pAsm->aArgSubst[3] = -1;
+ }
+
++static GLboolean next_ins(r700_AssemblerBase *pAsm)
++{
++ struct prog_instruction *pILInst = &(pAsm->pILInst[pAsm->uiCurInst]);
++
++ if (GL_TRUE == pAsm->is_tex)
++ {
++ if (pILInst->TexSrcTarget == TEXTURE_RECT_INDEX)
++ {
++ if (GL_FALSE == assemble_tex_instruction(pAsm, GL_FALSE))
++ {
++ radeon_error("Error assembling TEX instruction\n");
++ return GL_FALSE;
++ }
++ }
++ else
++ {
++ if (GL_FALSE == assemble_tex_instruction(pAsm, GL_TRUE))
++ {
++ radeon_error("Error assembling TEX instruction\n");
++ return GL_FALSE;
++ }
++ }
++ }
++ else
++ { //ALU
++ if (GL_FALSE == assemble_alu_instruction(pAsm))
++ {
++ radeon_error("Error assembling ALU instruction\n");
++ return GL_FALSE;
++ }
++ }
++
++ if (pAsm->D.dst.rtype == DST_REG_OUT)
++ {
++ assert(pAsm->D.dst.reg >= pAsm->starting_export_register_number);
++
++ if (pAsm->D.dst.op3)
++ {
++ // There is no mask for OP3 instructions, so all channels are written
++ pAsm->pucOutMask[pAsm->D.dst.reg - pAsm->starting_export_register_number] = 0xF;
++ }
++ else
++ {
++ pAsm->pucOutMask[pAsm->D.dst.reg - pAsm->starting_export_register_number]
++ |= (unsigned char)pAsm->pILInst[pAsm->uiCurInst].DstReg.WriteMask;
++ }
++ }
++
++ //reset for next inst.
++ pAsm->D.bits = 0;
++ pAsm->D2.bits = 0;
++ pAsm->S[0].bits = 0;
++ pAsm->S[1].bits = 0;
++ pAsm->S[2].bits = 0;
++ pAsm->is_tex = GL_FALSE;
++ pAsm->need_tex_barrier = GL_FALSE;
++ pAsm->D2.bits = 0;
++ pAsm->C[0].bits = pAsm->C[1].bits = pAsm->C[2].bits = pAsm->C[3].bits = 0;
++ return GL_TRUE;
++}
++
+ GLboolean mov_temp(r700_AssemblerBase* pAsm, int src)
+ {
+ GLuint tmp = gethelpr(pAsm);
+@@ -1201,7 +1264,7 @@ GLboolean checkop3(r700_AssemblerBase* pAsm)
+ {
+ if( GL_FALSE == mov_temp(pAsm, 1) )
+ {
+- return 1;
++ return GL_FALSE;
+ }
+ }
+
+@@ -2578,62 +2641,6 @@ GLboolean assemble_alu_instruction(r700_AssemblerBase *pAsm)
+ return GL_TRUE;
+ }
+
+-GLboolean next_ins(r700_AssemblerBase *pAsm)
+-{
+- struct prog_instruction *pILInst = &(pAsm->pILInst[pAsm->uiCurInst]);
+-
+- if( GL_TRUE == pAsm->is_tex )
+- {
+- if (pILInst->TexSrcTarget == TEXTURE_RECT_INDEX) {
+- if( GL_FALSE == assemble_tex_instruction(pAsm, GL_FALSE) )
+- {
+- radeon_error("Error assembling TEX instruction\n");
+- return GL_FALSE;
+- }
+- } else {
+- if( GL_FALSE == assemble_tex_instruction(pAsm, GL_TRUE) )
+- {
+- radeon_error("Error assembling TEX instruction\n");
+- return GL_FALSE;
+- }
+- }
+- }
+- else
+- { //ALU
+- if( GL_FALSE == assemble_alu_instruction(pAsm) )
+- {
+- radeon_error("Error assembling ALU instruction\n");
+- return GL_FALSE;
+- }
+- }
+-
+- if(pAsm->D.dst.rtype == DST_REG_OUT)
+- {
+- if(pAsm->D.dst.op3)
+- {
+- // There is no mask for OP3 instructions, so all channels are written
+- pAsm->pucOutMask[pAsm->D.dst.reg - pAsm->starting_export_register_number] = 0xF;
+- }
+- else
+- {
+- pAsm->pucOutMask[pAsm->D.dst.reg - pAsm->starting_export_register_number]
+- |= (unsigned char)pAsm->pILInst[pAsm->uiCurInst].DstReg.WriteMask;
+- }
+- }
+-
+- //reset for next inst.
+- pAsm->D.bits = 0;
+- pAsm->D2.bits = 0;
+- pAsm->S[0].bits = 0;
+- pAsm->S[1].bits = 0;
+- pAsm->S[2].bits = 0;
+- pAsm->is_tex = GL_FALSE;
+- pAsm->need_tex_barrier = GL_FALSE;
+- pAsm->D2.bits = 0;
+- pAsm->C[0].bits = pAsm->C[1].bits = pAsm->C[2].bits = pAsm->C[3].bits = 0;
+- return GL_TRUE;
+-}
+-
+ GLboolean assemble_math_function(r700_AssemblerBase* pAsm, BITS opcode)
+ {
+ BITS tmp;
+@@ -2865,25 +2872,92 @@ GLboolean assemble_CMP(r700_AssemblerBase *pAsm)
+
+ GLboolean assemble_TRIG(r700_AssemblerBase *pAsm, BITS opcode)
+ {
++ /*
++ * r600 - trunc to -PI..PI range
++ * r700 - normalize by dividing by 2PI
++ * see fdo bug 27901
++ */
++
+ int tmp;
+ checkop1(pAsm);
+
+ tmp = gethelpr(pAsm);
+
+- pAsm->D.dst.opcode = SQ_OP2_INST_MUL;
++ pAsm->D.dst.opcode = SQ_OP3_INST_MULADD;
++ pAsm->D.dst.op3 = 1;
++
+ setaddrmode_PVSDST(&(pAsm->D.dst), ADDR_ABSOLUTE);
+ pAsm->D.dst.rtype = DST_REG_TEMPORARY;
+ pAsm->D.dst.reg = tmp;
+- pAsm->D.dst.writex = 1;
+
+ assemble_src(pAsm, 0, -1);
+
+ pAsm->S[1].src.rtype = SRC_REC_LITERAL;
+ setswizzle_PVSSRC(&(pAsm->S[1].src), SQ_SEL_X);
++
++ pAsm->S[2].src.rtype = SRC_REC_LITERAL;
++ setswizzle_PVSSRC(&(pAsm->S[2].src), SQ_SEL_Y);
++
+ pAsm->D2.dst2.literal_slots = 1;
+ pAsm->C[0].f = 1/(3.1415926535 * 2);
+- pAsm->C[1].f = 0.0F;
+- next_ins(pAsm);
++ pAsm->C[1].f = 0.5f;
++
++ if ( GL_FALSE == next_ins(pAsm) )
++ {
++ return GL_FALSE;
++ }
++
++ pAsm->D.dst.opcode = SQ_OP2_INST_FRACT;
++
++ setaddrmode_PVSDST(&(pAsm->D.dst), ADDR_ABSOLUTE);
++ pAsm->D.dst.rtype = DST_REG_TEMPORARY;
++ pAsm->D.dst.reg = tmp;
++ pAsm->D.dst.writex = 1;
++
++ setaddrmode_PVSSRC(&(pAsm->S[0].src), ADDR_ABSOLUTE);
++ pAsm->S[0].src.rtype = SRC_REG_TEMPORARY;
++ pAsm->S[0].src.reg = tmp;
++ setswizzle_PVSSRC(&(pAsm->S[0].src), SQ_SEL_X);
++
++ if(( GL_FALSE == next_ins(pAsm) ))
++ {
++ return GL_FALSE;
++ }
++ pAsm->D.dst.opcode = SQ_OP3_INST_MULADD;
++ pAsm->D.dst.op3 = 1;
++
++ setaddrmode_PVSDST(&(pAsm->D.dst), ADDR_ABSOLUTE);
++ pAsm->D.dst.rtype = DST_REG_TEMPORARY;
++ pAsm->D.dst.reg = tmp;
++
++ setaddrmode_PVSSRC(&(pAsm->S[0].src), ADDR_ABSOLUTE);
++ pAsm->S[0].src.rtype = SRC_REG_TEMPORARY;
++ pAsm->S[0].src.reg = tmp;
++ setswizzle_PVSSRC(&(pAsm->S[0].src), SQ_SEL_X);
++
++ pAsm->S[1].src.rtype = SRC_REC_LITERAL;
++ setswizzle_PVSSRC(&(pAsm->S[1].src), SQ_SEL_X);
++
++ pAsm->S[2].src.rtype = SRC_REC_LITERAL;
++ setswizzle_PVSSRC(&(pAsm->S[2].src), SQ_SEL_Y);
++
++ pAsm->D2.dst2.literal_slots = 1;
++
++ if (pAsm->bR6xx)
++ {
++ pAsm->C[0].f = 3.1415926535897f * 2.0f;
++ pAsm->C[1].f = -3.1415926535897f;
++ }
++ else
++ {
++ pAsm->C[0].f = 1.0f;
++ pAsm->C[1].f = -0.5f;
++ }
++
++ if(( GL_FALSE == next_ins(pAsm) ))
++ {
++ return GL_FALSE;
++ }
+
+ pAsm->D.dst.opcode = opcode;
+ pAsm->D.dst.math = 1;
+@@ -4023,22 +4097,79 @@ GLboolean assemble_SCS(r700_AssemblerBase *pAsm)
+ checkop1(pAsm);
+
+ tmp = gethelpr(pAsm);
+- /* tmp.x = src /2*PI */
+- pAsm->D.dst.opcode = SQ_OP2_INST_MUL;
++
++ pAsm->D.dst.opcode = SQ_OP3_INST_MULADD;
++ pAsm->D.dst.op3 = 1;
++
+ setaddrmode_PVSDST(&(pAsm->D.dst), ADDR_ABSOLUTE);
+ pAsm->D.dst.rtype = DST_REG_TEMPORARY;
+ pAsm->D.dst.reg = tmp;
+- pAsm->D.dst.writex = 1;
+
+ assemble_src(pAsm, 0, -1);
+
+ pAsm->S[1].src.rtype = SRC_REC_LITERAL;
+ setswizzle_PVSSRC(&(pAsm->S[1].src), SQ_SEL_X);
++
++ pAsm->S[2].src.rtype = SRC_REC_LITERAL;
++ setswizzle_PVSSRC(&(pAsm->S[2].src), SQ_SEL_Y);
++
+ pAsm->D2.dst2.literal_slots = 1;
+ pAsm->C[0].f = 1/(3.1415926535 * 2);
+- pAsm->C[1].f = 0.0F;
++ pAsm->C[1].f = 0.5F;
+
+- next_ins(pAsm);
++ if ( GL_FALSE == next_ins(pAsm) )
++ {
++ return GL_FALSE;
++ }
++
++ pAsm->D.dst.opcode = SQ_OP2_INST_FRACT;
++
++ setaddrmode_PVSDST(&(pAsm->D.dst), ADDR_ABSOLUTE);
++ pAsm->D.dst.rtype = DST_REG_TEMPORARY;
++ pAsm->D.dst.reg = tmp;
++ pAsm->D.dst.writex = 1;
++
++ setaddrmode_PVSSRC(&(pAsm->S[0].src), ADDR_ABSOLUTE);
++ pAsm->S[0].src.rtype = SRC_REG_TEMPORARY;
++ pAsm->S[0].src.reg = tmp;
++ setswizzle_PVSSRC(&(pAsm->S[0].src), SQ_SEL_X);
++
++ if(( GL_FALSE == next_ins(pAsm) ))
++ {
++ return GL_FALSE;
++ }
++ pAsm->D.dst.opcode = SQ_OP3_INST_MULADD;
++ pAsm->D.dst.op3 = 1;
++
++ setaddrmode_PVSDST(&(pAsm->D.dst), ADDR_ABSOLUTE);
++ pAsm->D.dst.rtype = DST_REG_TEMPORARY;
++ pAsm->D.dst.reg = tmp;
++
++ setaddrmode_PVSSRC(&(pAsm->S[0].src), ADDR_ABSOLUTE);
++ pAsm->S[0].src.rtype = SRC_REG_TEMPORARY;
++ pAsm->S[0].src.reg = tmp;
++ setswizzle_PVSSRC(&(pAsm->S[0].src), SQ_SEL_X);
++
++ pAsm->S[1].src.rtype = SRC_REC_LITERAL;
++ setswizzle_PVSSRC(&(pAsm->S[1].src), SQ_SEL_X);
++
++ pAsm->S[2].src.rtype = SRC_REC_LITERAL;
++ setswizzle_PVSSRC(&(pAsm->S[2].src), SQ_SEL_Y);
++
++ pAsm->D2.dst2.literal_slots = 1;
++
++ if(pAsm->bR6xx) {
++ pAsm->C[0].f = 3.1415926535897f * 2.0f;
++ pAsm->C[1].f = -3.1415926535897f;
++ } else {
++ pAsm->C[0].f = 1.0f;
++ pAsm->C[1].f = -0.5f;
++ }
++
++ if(( GL_FALSE == next_ins(pAsm) ))
++ {
++ return GL_FALSE;
++ }
+
+ // COS dst.x, a.x
+ pAsm->D.dst.opcode = SQ_OP2_INST_COS;
+@@ -6154,7 +6285,7 @@ GLboolean callPreSub(r700_AssemblerBase* pAsm,
+ }
+ if(uNumValidSrc > 0)
+ {
+- prelude_cf_ptr = pAsm->cf_current_alu_clause_ptr;
++ prelude_cf_ptr = (R700ControlFlowGenericClause*) pAsm->cf_current_alu_clause_ptr;
+ pAsm->alu_x_opcode = SQ_CF_INST_ALU;
+ }
+
+@@ -6274,7 +6405,7 @@ GLboolean callPreSub(r700_AssemblerBase* pAsm,
+
+ next_ins(pAsm);
+
+- pAsm->callers[pAsm->unCallerArrayPointer - 1].finale_cf_ptr = pAsm->cf_current_alu_clause_ptr;
++ pAsm->callers[pAsm->unCallerArrayPointer - 1].finale_cf_ptr = (R700ControlFlowGenericClause*) pAsm->cf_current_alu_clause_ptr;
+ pAsm->callers[pAsm->unCallerArrayPointer - 1].prelude_cf_ptr = prelude_cf_ptr;
+ pAsm->alu_x_opcode = SQ_CF_INST_ALU;
+ }
+@@ -6347,6 +6478,8 @@ GLboolean Process_Export(r700_AssemblerBase* pAsm,
+
+ if (export_count == 1)
+ {
++ assert(starting_register_number >= pAsm->starting_export_register_number);
++
+ ucWriteMask = pAsm->pucOutMask[starting_register_number - pAsm->starting_export_register_number];
+ /* exports Z as a float into Red channel */
+ if (GL_TRUE == is_depth_export)
+@@ -6437,6 +6570,7 @@ GLboolean Process_Fragment_Exports(r700_AssemblerBase *pR700AsmCode,
+ {
+ unsigned int unBit;
+ GLuint export_count = 0;
++ unsigned int i;
+
+ if(pR700AsmCode->depth_export_register_number >= 0)
+ {
+@@ -6446,39 +6580,24 @@ GLboolean Process_Fragment_Exports(r700_AssemblerBase *pR700AsmCode,
+ }
+ }
+
+- unBit = 1 << FRAG_RESULT_COLOR;
+- if(OutputsWritten & unBit)
+- {
+- if( GL_FALSE == Process_Export(pR700AsmCode,
+- SQ_EXPORT_PIXEL,
+- 0,
+- 1,
+- pR700AsmCode->uiFP_OutputMap[FRAG_RESULT_COLOR],
+- GL_FALSE) )
+- {
+- return GL_FALSE;
+- }
+- export_count++;
+- }
+- unBit = 1 << FRAG_RESULT_DEPTH;
+- if(OutputsWritten & unBit)
+- {
+- if( GL_FALSE == Process_Export(pR700AsmCode,
+- SQ_EXPORT_PIXEL,
+- 0,
+- 1,
+- pR700AsmCode->uiFP_OutputMap[FRAG_RESULT_DEPTH],
+- GL_TRUE))
++ for (i = 0; i < FRAG_RESULT_MAX; ++i)
++ {
++ unBit = 1 << i;
++
++ if (OutputsWritten & unBit)
+ {
+- return GL_FALSE;
++ GLboolean is_depth = i == FRAG_RESULT_DEPTH ? GL_TRUE : GL_FALSE;
++ if (!Process_Export(pR700AsmCode, SQ_EXPORT_PIXEL, 0, 1, pR700AsmCode->uiFP_OutputMap[i], is_depth))
++ return GL_FALSE;
++ ++export_count;
+ }
+- export_count++;
+- }
++ }
++
+ /* Need to export something, otherwise we'll hang
+ * results are undefined anyway */
+ if(export_count == 0)
+ {
+- Process_Export(pR700AsmCode, SQ_EXPORT_PIXEL, 0, 1, 0, GL_FALSE);
++ Process_Export(pR700AsmCode, SQ_EXPORT_PIXEL, 0, 1, pR700AsmCode->starting_export_register_number, GL_FALSE);
+ }
+
+ if(pR700AsmCode->cf_last_export_ptr != NULL)
+@@ -6511,13 +6630,30 @@ GLboolean Process_Vertex_Exports(r700_AssemblerBase *pR700AsmCode,
+ {
+ return GL_FALSE;
+ }
++ export_starting_index++;
++ export_count--;
++ }
+
++ unBit = 1 << VERT_RESULT_PSIZ;
++ if(OutputsWritten & unBit)
++ {
++ if( GL_FALSE == Process_Export(pR700AsmCode,
++ SQ_EXPORT_POS,
++ export_starting_index,
++ 1,
++ pR700AsmCode->ucVP_OutputMap[VERT_RESULT_PSIZ],
++ GL_FALSE) )
++ {
++ return GL_FALSE;
++ }
+ export_count--;
++ }
++
++ pR700AsmCode->cf_last_export_ptr->m_Word1.f.cf_inst = SQ_CF_INST_EXPORT_DONE;
+
+- pR700AsmCode->cf_last_export_ptr->m_Word1.f.cf_inst = SQ_CF_INST_EXPORT_DONE;
+- }
+
+ pR700AsmCode->number_of_exports = export_count;
++ export_starting_index = 0;
+
+ unBit = 1 << VERT_RESULT_COL0;
+ if(OutputsWritten & unBit)
+diff --git a/src/mesa/drivers/dri/r600/r700_assembler.h b/src/mesa/drivers/dri/r600/r700_assembler.h
+index 0064d08..2d3c324 100644
+--- a/src/mesa/drivers/dri/r600/r700_assembler.h
++++ b/src/mesa/drivers/dri/r600/r700_assembler.h
+@@ -582,7 +582,6 @@ GLboolean check_scalar(r700_AssemblerBase* pAsm,
+ GLboolean check_vector(r700_AssemblerBase* pAsm,
+ R700ALUInstruction* alu_instruction_ptr);
+ GLboolean assemble_alu_instruction(r700_AssemblerBase *pAsm);
+-GLboolean next_ins(r700_AssemblerBase *pAsm);
+
+ GLboolean pops(r700_AssemblerBase *pAsm, GLuint pops);
+ GLboolean jumpToOffest(r700_AssemblerBase *pAsm, GLuint pops, GLint offset);
+diff --git a/src/mesa/drivers/dri/r600/r700_fragprog.c b/src/mesa/drivers/dri/r600/r700_fragprog.c
+index 84d51e6..39234af 100644
+--- a/src/mesa/drivers/dri/r600/r700_fragprog.c
++++ b/src/mesa/drivers/dri/r600/r700_fragprog.c
+@@ -226,22 +226,23 @@ void Map_Fragment_Program(r700_AssemblerBase *pAsm,
+ pAsm->number_of_exports = 0;
+ pAsm->number_of_colorandz_exports = 0; /* don't include stencil and mask out. */
+ pAsm->starting_export_register_number = pAsm->number_used_registers;
+- unBit = 1 << FRAG_RESULT_COLOR;
+- if(mesa_fp->Base.OutputsWritten & unBit)
+- {
+- pAsm->uiFP_OutputMap[FRAG_RESULT_COLOR] = pAsm->number_used_registers++;
+- pAsm->number_of_exports++;
+- pAsm->number_of_colorandz_exports++;
+- }
+- unBit = 1 << FRAG_RESULT_DEPTH;
+- if(mesa_fp->Base.OutputsWritten & unBit)
+- {
+- pAsm->depth_export_register_number = pAsm->number_used_registers;
+- pAsm->uiFP_OutputMap[FRAG_RESULT_DEPTH] = pAsm->number_used_registers++;
+- pAsm->number_of_exports++;
+- pAsm->number_of_colorandz_exports++;
+- pAsm->pR700Shader->depthIsExported = 1;
+- }
++
++ for (i = 0; i < FRAG_RESULT_MAX; ++i)
++ {
++ unBit = 1 << i;
++ if (mesa_fp->Base.OutputsWritten & unBit)
++ {
++ if (i == FRAG_RESULT_DEPTH)
++ {
++ pAsm->depth_export_register_number = pAsm->number_used_registers;
++ pAsm->pR700Shader->depthIsExported = 1;
++ }
++
++ pAsm->uiFP_OutputMap[i] = pAsm->number_used_registers++;
++ ++pAsm->number_of_exports;
++ ++pAsm->number_of_colorandz_exports;
++ }
++ }
+
+ pAsm->pucOutMask = (unsigned char*) MALLOC(pAsm->number_of_exports);
+ for(ui=0; ui<pAsm->number_of_exports; ui++)
+@@ -560,27 +561,34 @@ GLboolean r700SetupFragmentProgram(GLcontext * ctx)
+ CLEARbit(r700->SPI_PS_IN_CONTROL_1.u32All, FRONT_FACE_ENA_bit);
+ }
+
+- /* see if we need any point_sprite replacements */
+- for (i = VERT_RESULT_TEX0; i<= VERT_RESULT_TEX7; i++)
++ /* see if we need any point_sprite replacements, also increase num_interp
++ * as there's no vp output for them */
++ if (ctx->Point.PointSprite)
+ {
+- if(ctx->Point.CoordReplace[i - VERT_RESULT_TEX0] == GL_TRUE)
+- point_sprite = GL_TRUE;
++ for (i = FRAG_ATTRIB_TEX0; i<= FRAG_ATTRIB_TEX7; i++)
++ {
++ if (ctx->Point.CoordReplace[i - FRAG_ATTRIB_TEX0] == GL_TRUE)
++ {
++ ui++;
++ point_sprite = GL_TRUE;
++ }
++ }
+ }
+
++ if( mesa_fp->Base.InputsRead & (1 << FRAG_ATTRIB_PNTC))
++ ui++;
++
+ if ((mesa_fp->Base.InputsRead & (1 << FRAG_ATTRIB_PNTC)) || point_sprite)
+ {
+- /* for FRAG_ATTRIB_PNTC we need to increase num_interp */
+- if(mesa_fp->Base.InputsRead & (1 << FRAG_ATTRIB_PNTC))
+- {
+- ui++;
+- SETfield(r700->SPI_PS_IN_CONTROL_0.u32All, ui, NUM_INTERP_shift, NUM_INTERP_mask);
+- }
++ SETfield(r700->SPI_PS_IN_CONTROL_0.u32All, ui, NUM_INTERP_shift, NUM_INTERP_mask);
+ SETbit(r700->SPI_INTERP_CONTROL_0.u32All, PNT_SPRITE_ENA_bit);
+ SETfield(r700->SPI_INTERP_CONTROL_0.u32All, SPI_PNT_SPRITE_SEL_S, PNT_SPRITE_OVRD_X_shift, PNT_SPRITE_OVRD_X_mask);
+ SETfield(r700->SPI_INTERP_CONTROL_0.u32All, SPI_PNT_SPRITE_SEL_T, PNT_SPRITE_OVRD_Y_shift, PNT_SPRITE_OVRD_Y_mask);
+ SETfield(r700->SPI_INTERP_CONTROL_0.u32All, SPI_PNT_SPRITE_SEL_0, PNT_SPRITE_OVRD_Z_shift, PNT_SPRITE_OVRD_Z_mask);
+ SETfield(r700->SPI_INTERP_CONTROL_0.u32All, SPI_PNT_SPRITE_SEL_1, PNT_SPRITE_OVRD_W_shift, PNT_SPRITE_OVRD_W_mask);
+- if(ctx->Point.SpriteOrigin == GL_LOWER_LEFT)
++ /* Like e.g. viewport and winding, point sprite coordinates are
++ * inverted when rendering to FBO. */
++ if ((ctx->Point.SpriteOrigin == GL_LOWER_LEFT) == !ctx->DrawBuffer->Name)
+ SETbit(r700->SPI_INTERP_CONTROL_0.u32All, PNT_SPRITE_TOP_1_bit);
+ else
+ CLEARbit(r700->SPI_INTERP_CONTROL_0.u32All, PNT_SPRITE_TOP_1_bit);
+@@ -668,8 +676,9 @@ GLboolean r700SetupFragmentProgram(GLcontext * ctx)
+
+ for(i=0; i<8; i++)
+ {
++ GLboolean coord_replace = ctx->Point.PointSprite && ctx->Point.CoordReplace[i];
+ unBit = 1 << (VERT_RESULT_TEX0 + i);
+- if(OutputsWritten & unBit)
++ if ((OutputsWritten & unBit) || coord_replace)
+ {
+ ui = pAsm->uiFP_AttributeMap[FRAG_ATTRIB_TEX0 + i];
+ SETbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, SEL_CENTROID_bit);
+@@ -677,7 +686,7 @@ GLboolean r700SetupFragmentProgram(GLcontext * ctx)
+ SEMANTIC_shift, SEMANTIC_mask);
+ CLEARbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, FLAT_SHADE_bit);
+ /* ARB_point_sprite */
+- if(ctx->Point.CoordReplace[i] == GL_TRUE)
++ if (coord_replace)
+ {
+ SETbit(r700->SPI_PS_INPUT_CNTL[ui].u32All, PT_SPRITE_TEX_bit);
+ }
+diff --git a/src/mesa/drivers/dri/r600/r700_vertprog.c b/src/mesa/drivers/dri/r600/r700_vertprog.c
+index 05c6516..14dd2a5 100644
+--- a/src/mesa/drivers/dri/r600/r700_vertprog.c
++++ b/src/mesa/drivers/dri/r600/r700_vertprog.c
+@@ -628,6 +628,16 @@ GLboolean r700SetupVertexProgram(GLcontext * ctx)
+
+ R600_STATECHANGE(context, spi);
+
++ if(vp->mesa_program->Base.OutputsWritten & (1 << VERT_RESULT_PSIZ)) {
++ R600_STATECHANGE(context, cl);
++ SETbit(r700->PA_CL_VS_OUT_CNTL.u32All, USE_VTX_POINT_SIZE_bit);
++ SETbit(r700->PA_CL_VS_OUT_CNTL.u32All, VS_OUT_MISC_VEC_ENA_bit);
++ } else if (r700->PA_CL_VS_OUT_CNTL.u32All != 0) {
++ R600_STATECHANGE(context, cl);
++ CLEARbit(r700->PA_CL_VS_OUT_CNTL.u32All, USE_VTX_POINT_SIZE_bit);
++ CLEARbit(r700->PA_CL_VS_OUT_CNTL.u32All, VS_OUT_MISC_VEC_ENA_bit);
++ }
++
+ SETfield(r700->SPI_VS_OUT_CONFIG.u32All,
+ vp->r700Shader.nParamExports ? (vp->r700Shader.nParamExports - 1) : 0,
+ VS_EXPORT_COUNT_shift, VS_EXPORT_COUNT_mask);
+diff --git a/src/mesa/drivers/dri/radeon/radeon_chipset.h b/src/mesa/drivers/dri/radeon/radeon_chipset.h
+index 98732c8..6dbfdc9 100644
+--- a/src/mesa/drivers/dri/radeon/radeon_chipset.h
++++ b/src/mesa/drivers/dri/radeon/radeon_chipset.h
+@@ -413,9 +413,9 @@ enum {
+ CHIP_FAMILY_R350,
+ CHIP_FAMILY_RV350,
+ CHIP_FAMILY_RV380,
++ CHIP_FAMILY_RS400,
+ CHIP_FAMILY_R420,
+ CHIP_FAMILY_RV410,
+- CHIP_FAMILY_RS400,
+ CHIP_FAMILY_RS600,
+ CHIP_FAMILY_RS690,
+ CHIP_FAMILY_RS740,
+diff --git a/src/mesa/drivers/dri/radeon/radeon_common_context.c b/src/mesa/drivers/dri/radeon/radeon_common_context.c
+index 94f4766..5a7d52c 100644
+--- a/src/mesa/drivers/dri/radeon/radeon_common_context.c
++++ b/src/mesa/drivers/dri/radeon/radeon_common_context.c
+@@ -300,10 +300,10 @@ void radeonDestroyContext(__DRIcontext *driContextPriv )
+ _mesa_meta_free(radeon->glCtx);
+
+ if (radeon == current) {
+- radeon_firevertices(radeon);
+ _mesa_make_current(NULL, NULL, NULL);
+ }
+
++ radeon_firevertices(radeon);
+ if (!is_empty_list(&radeon->dma.reserved)) {
+ rcommonFlushCmdBuf( radeon, __FUNCTION__ );
+ }
+diff --git a/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c b/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c
+index 6c570a5..f3ce852 100644
+--- a/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c
++++ b/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c
+@@ -588,17 +588,17 @@ int radeon_validate_texture_miptree(GLcontext * ctx, struct gl_texture_object *t
+ __FUNCTION__, texObj ,t->minLod, t->maxLod);
+
+ radeon_mipmap_tree *dst_miptree;
+- dst_miptree = get_biggest_matching_miptree(t, t->minLod, t->maxLod);
++ dst_miptree = get_biggest_matching_miptree(t, t->base.BaseLevel, t->base.MaxLevel);
+
++ radeon_miptree_unreference(&t->mt);
+ if (!dst_miptree) {
+- radeon_miptree_unreference(&t->mt);
+ radeon_try_alloc_miptree(rmesa, t);
+- dst_miptree = t->mt;
+ radeon_print(RADEON_TEXTURE, RADEON_NORMAL,
+ "%s: No matching miptree found, allocated new one %p\n",
+ __FUNCTION__, t->mt);
+
+ } else {
++ radeon_miptree_reference(dst_miptree, &t->mt);
+ radeon_print(RADEON_TEXTURE, RADEON_NORMAL,
+ "%s: Using miptree %p\n", __FUNCTION__, t->mt);
+ }
+@@ -615,7 +615,7 @@ int radeon_validate_texture_miptree(GLcontext * ctx, struct gl_texture_object *t
+ "Checking image level %d, face %d, mt %p ... ",
+ level, face, img->mt);
+
+- if (img->mt != dst_miptree) {
++ if (img->mt != t->mt) {
+ radeon_print(RADEON_TEXTURE, RADEON_TRACE,
+ "MIGRATING\n");
+
+@@ -623,7 +623,7 @@ int radeon_validate_texture_miptree(GLcontext * ctx, struct gl_texture_object *t
+ if (src_bo && radeon_bo_is_referenced_by_cs(src_bo, rmesa->cmdbuf.cs)) {
+ radeon_firevertices(rmesa);
+ }
+- migrate_image_to_miptree(dst_miptree, img, face, level);
++ migrate_image_to_miptree(t->mt, img, face, level);
+ } else
+ radeon_print(RADEON_TEXTURE, RADEON_TRACE, "OK\n");
+ }
+diff --git a/src/mesa/drivers/dri/radeon/radeon_tex_copy.c b/src/mesa/drivers/dri/radeon/radeon_tex_copy.c
+index 5cfad6f..fb6f2e5 100644
+--- a/src/mesa/drivers/dri/radeon/radeon_tex_copy.c
++++ b/src/mesa/drivers/dri/radeon/radeon_tex_copy.c
+@@ -52,22 +52,34 @@ do_copy_texsubimage(GLcontext *ctx,
+ gl_format dst_mesaformat;
+ unsigned src_width;
+ unsigned dst_width;
++ unsigned flip_y;
+
+ if (!radeon->vtbl.blit) {
+ return GL_FALSE;
+ }
+
+ if (_mesa_get_format_bits(timg->base.TexFormat, GL_DEPTH_BITS) > 0) {
+- rrb = radeon_get_depthbuffer(radeon);
++ if (ctx->ReadBuffer->_DepthBuffer && ctx->ReadBuffer->_DepthBuffer->Wrapped) {
++ rrb = radeon_renderbuffer(ctx->ReadBuffer->_DepthBuffer->Wrapped);
++ } else {
++ rrb = radeon_renderbuffer(ctx->ReadBuffer->_DepthBuffer);
++ }
++ flip_y = ctx->ReadBuffer->Attachment[BUFFER_DEPTH].Type == GL_NONE;
+ } else {
+- rrb = radeon_get_colorbuffer(radeon);
++ rrb = radeon_renderbuffer(ctx->ReadBuffer->_ColorReadBuffer);
++ flip_y = ctx->ReadBuffer->Attachment[BUFFER_COLOR0].Type == GL_NONE;
++ }
++
++ // This is software renderbuffer, fallback to swrast
++ if (!rrb) {
++ return GL_FALSE;
+ }
+
+ if (!timg->mt) {
+ radeon_validate_texture_miptree(ctx, &tobj->base);
+ }
+
+- assert(rrb && rrb->bo);
++ assert(rrb->bo);
+ assert(timg->mt);
+ assert(timg->mt->bo);
+ assert(timg->base.Width >= dstx + width);
+@@ -124,7 +136,7 @@ do_copy_texsubimage(GLcontext *ctx,
+ timg->mt->bo, dst_offset, dst_mesaformat,
+ timg->mt->levels[level].rowstride / dst_bpp,
+ dst_width, timg->base.Height,
+- dstx, dsty, width, height, 1);
++ dstx, dsty, width, height, flip_y);
+ }
+
+ void
+diff --git a/src/mesa/drivers/dri/radeon/radeon_texture.c b/src/mesa/drivers/dri/radeon/radeon_texture.c
+index ff37fd3..caa55d2 100644
+--- a/src/mesa/drivers/dri/radeon/radeon_texture.c
++++ b/src/mesa/drivers/dri/radeon/radeon_texture.c
+@@ -1016,7 +1016,15 @@ radeon_get_tex_image(GLcontext * ctx, GLenum target, GLint level,
+ __func__, ctx, texObj, image, compressed);
+
+ if (image->mt) {
++ radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
+ /* Map the texture image read-only */
++ if (radeon_bo_is_referenced_by_cs(image->mt->bo, rmesa->cmdbuf.cs)) {
++ radeon_print(RADEON_TEXTURE, RADEON_VERBOSE,
++ "%s: called for texture that is queued for GPU processing\n",
++ __func__);
++ radeon_firevertices(rmesa);
++ }
++
+ radeon_teximage_map(image, GL_FALSE);
+ } else {
+ /* Image hasn't been uploaded to a miptree yet */
+diff --git a/src/mesa/drivers/osmesa/osmesa.c b/src/mesa/drivers/osmesa/osmesa.c
+index e376f12..c5e874b 100644
+--- a/src/mesa/drivers/osmesa/osmesa.c
++++ b/src/mesa/drivers/osmesa/osmesa.c
+@@ -1061,7 +1061,6 @@ OSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits,
+ struct dd_function_table functions;
+ GLint rind, gind, bind, aind;
+ GLint redBits = 0, greenBits = 0, blueBits = 0, alphaBits =0;
+- GLenum type = CHAN_TYPE;
+
+ rind = gind = bind = aind = 0;
+ if (format==OSMESA_RGBA) {
+@@ -1329,6 +1328,7 @@ OSMesaMakeCurrent( OSMesaContext osmesa, void *buffer, GLenum type,
+ * size.
+ */
+ osmesa->rb = new_osmesa_renderbuffer(&osmesa->mesa, osmesa->format, type);
++ _mesa_remove_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT);
+ _mesa_add_renderbuffer(osmesa->gl_buffer, BUFFER_FRONT_LEFT, osmesa->rb);
+ assert(osmesa->rb->RefCount == 2);
+
+diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c
+index 71d1514..98bb7fa 100644
+--- a/src/mesa/main/bufferobj.c
++++ b/src/mesa/main/bufferobj.c
+@@ -1880,7 +1880,7 @@ _mesa_BufferObjectUnpurgeable(GLcontext *ctx, GLuint name, GLenum option)
+
+ bufObj->Purgeable = GL_FALSE;
+
+- retval = GL_RETAINED_APPLE;
++ retval = option;
+ if (ctx->Driver.BufferObjectUnpurgeable)
+ retval = ctx->Driver.BufferObjectUnpurgeable(ctx, bufObj, option);
+
+@@ -1910,11 +1910,11 @@ _mesa_RenderObjectUnpurgeable(GLcontext *ctx, GLuint name, GLenum option)
+
+ bufObj->Purgeable = GL_FALSE;
+
+- retval = GL_RETAINED_APPLE;
++ retval = option;
+ if (ctx->Driver.RenderObjectUnpurgeable)
+ retval = ctx->Driver.RenderObjectUnpurgeable(ctx, bufObj, option);
+
+- return option;
++ return retval;
+ }
+
+
+@@ -1940,7 +1940,7 @@ _mesa_TextureObjectUnpurgeable(GLcontext *ctx, GLuint name, GLenum option)
+
+ bufObj->Purgeable = GL_FALSE;
+
+- retval = GL_RETAINED_APPLE;
++ retval = option;
+ if (ctx->Driver.TextureObjectUnpurgeable)
+ retval = ctx->Driver.TextureObjectUnpurgeable(ctx, bufObj, option);
+
+diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c
+index 73126b9..1dc0c9c 100644
+--- a/src/mesa/main/context.c
++++ b/src/mesa/main/context.c
+@@ -1358,6 +1358,8 @@ _mesa_make_current( GLcontext *newCtx, GLframebuffer *drawBuffer,
+ if (newCtx->FirstTimeCurrent) {
+ _mesa_compute_version(newCtx);
+
++ newCtx->Extensions.String = _mesa_make_extension_string(newCtx);
++
+ check_context_limits(newCtx);
+
+ /* We can use this to help debug user's problems. Tell them to set
+diff --git a/src/mesa/main/getstring.c b/src/mesa/main/getstring.c
+index 51dd5f7..b9daaba 100644
+--- a/src/mesa/main/getstring.c
++++ b/src/mesa/main/getstring.c
+@@ -71,8 +71,6 @@ _mesa_GetString( GLenum name )
+ case GL_VERSION:
+ return (const GLubyte *) ctx->VersionString;
+ case GL_EXTENSIONS:
+- if (!ctx->Extensions.String)
+- ctx->Extensions.String = _mesa_make_extension_string(ctx);
+ return (const GLubyte *) ctx->Extensions.String;
+ #if FEATURE_ARB_shading_language_100
+ case GL_SHADING_LANGUAGE_VERSION_ARB:
+diff --git a/src/mesa/main/state.c b/src/mesa/main/state.c
+index b971cc9..db84de2 100644
+--- a/src/mesa/main/state.c
++++ b/src/mesa/main/state.c
+@@ -537,7 +537,7 @@ _mesa_update_state_locked( GLcontext *ctx )
+
+ /* Determine which state flags effect vertex/fragment program state */
+ if (ctx->FragmentProgram._MaintainTexEnvProgram) {
+- prog_flags |= (_NEW_TEXTURE | _NEW_FOG |
++ prog_flags |= (_NEW_BUFFERS | _NEW_TEXTURE | _NEW_FOG |
+ _NEW_ARRAY | _NEW_LIGHT | _NEW_POINT | _NEW_RENDERMODE |
+ _NEW_PROGRAM);
+ }
+diff --git a/src/mesa/main/texenvprogram.c b/src/mesa/main/texenvprogram.c
+index 964ba13..df09c12 100644
+--- a/src/mesa/main/texenvprogram.c
++++ b/src/mesa/main/texenvprogram.c
+@@ -98,6 +98,7 @@ struct state_key {
+ GLuint fog_enabled:1;
+ GLuint fog_mode:2; /**< FOG_x */
+ GLuint inputs_available:12;
++ GLuint num_draw_buffers:4;
+
+ /* NOTE: This array of structs must be last! (see "keySize" below) */
+ struct {
+@@ -485,6 +486,9 @@ static GLuint make_state_key( GLcontext *ctx, struct state_key *key )
+ inputs_referenced |= FRAG_BIT_FOGC; /* maybe */
+ }
+
++ /* _NEW_BUFFERS */
++ key->num_draw_buffers = ctx->DrawBuffer->_NumColorDrawBuffers;
++
+ key->inputs_available = (inputs_available & inputs_referenced);
+
+ /* compute size of state key, ignoring unused texture units */
+@@ -1199,11 +1203,14 @@ emit_texenv(struct texenv_fragment_program *p, GLuint unit)
+ else
+ alpha_saturate = GL_FALSE;
+
+- /* If this is the very last calculation, emit direct to output reg:
++ /* If this is the very last calculation (and various other conditions
++ * are met), emit directly to the color output register. Otherwise,
++ * emit to a temporary register.
+ */
+ if (key->separate_specular ||
+ unit != p->last_tex_stage ||
+ alpha_shift ||
++ key->num_draw_buffers != 1 ||
+ rgb_shift)
+ dest = get_temp( p );
+ else
+@@ -1438,10 +1445,10 @@ create_new_program(GLcontext *ctx, struct state_key *key,
+ p.program->Base.Parameters = _mesa_new_parameter_list();
+ p.program->Base.InputsRead = 0x0;
+
+- if (ctx->DrawBuffer->_NumColorDrawBuffers == 1)
++ if (key->num_draw_buffers == 1)
+ p.program->Base.OutputsWritten = 1 << FRAG_RESULT_COLOR;
+ else {
+- for (i = 0; i < ctx->DrawBuffer->_NumColorDrawBuffers; i++)
++ for (i = 0; i < key->num_draw_buffers; i++)
+ p.program->Base.OutputsWritten |= (1 << (FRAG_RESULT_DATA0 + i));
+ }
+
+@@ -1493,8 +1500,8 @@ create_new_program(GLcontext *ctx, struct state_key *key,
+
+ cf = get_source( &p, SRC_PREVIOUS, 0 );
+
+- for (i = 0; i < ctx->DrawBuffer->_NumColorDrawBuffers; i++) {
+- if (ctx->DrawBuffer->_NumColorDrawBuffers == 1)
++ for (i = 0; i < key->num_draw_buffers; i++) {
++ if (key->num_draw_buffers == 1)
+ out = make_ureg( PROGRAM_OUTPUT, FRAG_RESULT_COLOR );
+ else {
+ out = make_ureg( PROGRAM_OUTPUT, FRAG_RESULT_DATA0 + i );
+diff --git a/src/mesa/main/version.h b/src/mesa/main/version.h
+index 9955be2..af4e69f 100644
+--- a/src/mesa/main/version.h
++++ b/src/mesa/main/version.h
+@@ -34,8 +34,8 @@
+ /* Mesa version */
+ #define MESA_MAJOR 7
+ #define MESA_MINOR 8
+-#define MESA_PATCH 2
+-#define MESA_VERSION_STRING "7.8.2"
++#define MESA_PATCH 3
++#define MESA_VERSION_STRING "7.8.3"
+
+ /* To make version comparison easy */
+ #define MESA_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
+diff --git a/src/mesa/shader/slang/slang_builtin.c b/src/mesa/shader/slang/slang_builtin.c
+index 791e751..f265285 100644
+--- a/src/mesa/shader/slang/slang_builtin.c
++++ b/src/mesa/shader/slang/slang_builtin.c
+@@ -399,7 +399,7 @@ lookup_statevar(const char *var, GLint index1, GLint index2, const char *field,
+ }
+
+ if (isMatrix) {
+- /* load all four columns of matrix */
++ /* load all four rows (or columns) of matrix */
+ GLint pos[4];
+ GLuint j;
+ for (j = 0; j < 4; j++) {
+@@ -489,9 +489,26 @@ emit_statevars(const char *name, int array_len,
+ tokens[0] = STATE_TEXGEN;
+ tokens[2] = STATE_TEXGEN_OBJECT_Q;
+ }
++ else if (strcmp(name, "gl_TextureMatrix") == 0) {
++ tokens[0] = STATE_TEXTURE_MATRIX;
++ tokens[4] = STATE_MATRIX_TRANSPOSE;
++ }
++ else if (strcmp(name, "gl_TextureMatrixInverse") == 0) {
++ tokens[0] = STATE_TEXTURE_MATRIX;
++ tokens[4] = STATE_MATRIX_INVTRANS;
++ }
++ else if (strcmp(name, "gl_TextureMatrixTranspose") == 0) {
++ tokens[0] = STATE_TEXTURE_MATRIX;
++ tokens[4] = 0;
++ }
++ else if (strcmp(name, "gl_TextureMatrixInverseTranspose") == 0) {
++ tokens[0] = STATE_TEXTURE_MATRIX;
++ tokens[4] = STATE_MATRIX_INVERSE;
++ }
+ else {
+ return -1; /* invalid array name */
+ }
++ /* emit state vars for each array element */
+ for (i = 0; i < array_len; i++) {
+ GLint p;
+ tokens[1] = i;
+@@ -513,6 +530,19 @@ emit_statevars(const char *name, int array_len,
+ }
+ return pos;
+ }
++ else if (type->type == SLANG_SPEC_MAT4) {
++ /* unroll/emit 4 array rows (or columns) */
++ slang_type_specifier vec4;
++ GLint i, p, pos = -1;
++ vec4.type = SLANG_SPEC_VEC4;
++ for (i = 0; i < 4; i++) {
++ tokens[2] = tokens[3] = i; /* row[i] (or column[i]) of matrix */
++ p = emit_statevars(NULL, 0, &vec4, tokens, paramList);
++ if (pos == -1)
++ pos = p;
++ }
++ return pos;
++ }
+ else {
+ GLint pos;
+ assert(type->type == SLANG_SPEC_VEC4 ||
+diff --git a/src/mesa/shader/slang/slang_emit.c b/src/mesa/shader/slang/slang_emit.c
+index 7c0ea0c..4155052 100644
+--- a/src/mesa/shader/slang/slang_emit.c
++++ b/src/mesa/shader/slang/slang_emit.c
+@@ -2362,7 +2362,10 @@ emit(slang_emit_info *emitInfo, slang_ir_node *n)
+ #if 0
+ assert(!n->Store);
+ #endif
+- n->Store = n->Children[1]->Store;
++ if (n->Children[1]->Store)
++ n->Store = n->Children[1]->Store;
++ else
++ n->Store = n->Children[0]->Store;
+ return inst;
+
+ case IR_SCOPE:
+@@ -2370,6 +2373,7 @@ emit(slang_emit_info *emitInfo, slang_ir_node *n)
+ _slang_push_var_table(emitInfo->vt);
+ inst = emit(emitInfo, n->Children[0]);
+ _slang_pop_var_table(emitInfo->vt);
++ n->Store = n->Children[0]->Store;
+ return inst;
+
+ case IR_VAR_DECL:
+diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c
+index 5fcfa86..a64c561 100644
+--- a/src/mesa/state_tracker/st_cb_drawpixels.c
++++ b/src/mesa/state_tracker/st_cb_drawpixels.c
+@@ -1135,7 +1135,7 @@ st_destroy_drawpix(struct st_context *st)
+ st_reference_fragprog(st, &st->drawpix.z_shader, NULL);
+ st_reference_fragprog(st, &st->pixel_xfer.combined_prog, NULL);
+ if (st->drawpix.vert_shaders[0])
+- free(st->drawpix.vert_shaders[0]);
++ ureg_free_tokens(st->drawpix.vert_shaders[0]);
+ if (st->drawpix.vert_shaders[1])
+- free(st->drawpix.vert_shaders[1]);
++ ureg_free_tokens(st->drawpix.vert_shaders[1]);
+ }
+diff --git a/src/mesa/state_tracker/st_cb_fbo.c b/src/mesa/state_tracker/st_cb_fbo.c
+index 00e9d1d..df5674d 100644
+--- a/src/mesa/state_tracker/st_cb_fbo.c
++++ b/src/mesa/state_tracker/st_cb_fbo.c
+@@ -460,26 +460,38 @@ static void
+ st_validate_framebuffer(GLcontext *ctx, struct gl_framebuffer *fb)
+ {
+ struct pipe_screen *screen = ctx->st->pipe->screen;
+- const struct gl_renderbuffer *depthRb =
+- fb->Attachment[BUFFER_DEPTH].Renderbuffer;
+- const struct gl_renderbuffer *stencilRb =
+- fb->Attachment[BUFFER_STENCIL].Renderbuffer;
++ const struct gl_renderbuffer_attachment *depth =
++ &fb->Attachment[BUFFER_DEPTH];
++ const struct gl_renderbuffer_attachment *stencil =
++ &fb->Attachment[BUFFER_STENCIL];
+ GLuint i;
+
+- if (stencilRb && depthRb && stencilRb != depthRb) {
++ if (depth->Type && stencil->Type && depth->Type != stencil->Type) {
++ fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED_EXT;
++ return;
++ }
++ if (depth->Type == GL_RENDERBUFFER_EXT &&
++ stencil->Type == GL_RENDERBUFFER_EXT &&
++ depth->Renderbuffer != stencil->Renderbuffer) {
++ fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED_EXT;
++ return;
++ }
++ if (depth->Type == GL_TEXTURE &&
++ stencil->Type == GL_TEXTURE &&
++ depth->Texture != stencil->Texture) {
+ fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED_EXT;
+ return;
+ }
+
+ if (!st_validate_attachment(screen,
+- &fb->Attachment[BUFFER_DEPTH],
+- PIPE_TEXTURE_USAGE_DEPTH_STENCIL)) {
++ depth,
++ PIPE_TEXTURE_USAGE_DEPTH_STENCIL)) {
+ fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED_EXT;
+ return;
+ }
+ if (!st_validate_attachment(screen,
+- &fb->Attachment[BUFFER_STENCIL],
+- PIPE_TEXTURE_USAGE_DEPTH_STENCIL)) {
++ stencil,
++ PIPE_TEXTURE_USAGE_DEPTH_STENCIL)) {
+ fb->_Status = GL_FRAMEBUFFER_UNSUPPORTED_EXT;
+ return;
+ }
+diff --git a/src/mesa/state_tracker/st_cb_readpixels.c b/src/mesa/state_tracker/st_cb_readpixels.c
+index 952d9ce..7ff10d4 100644
+--- a/src/mesa/state_tracker/st_cb_readpixels.c
++++ b/src/mesa/state_tracker/st_cb_readpixels.c
+@@ -69,6 +69,10 @@ st_read_stencil_pixels(GLcontext *ctx, GLint x, GLint y,
+ ubyte *stmap;
+ GLint j;
+
++ if (strb->Base.Wrapped) {
++ strb = st_renderbuffer(strb->Base.Wrapped);
++ }
++
+ if (st_fb_orientation(ctx->DrawBuffer) == Y_0_TOP) {
+ y = ctx->DrawBuffer->Height - y - height;
+ }
+@@ -366,6 +370,9 @@ st_readpixels(GLcontext *ctx, GLint x, GLint y, GLsizei width, GLsizei height,
+ }
+ else if (format == GL_DEPTH_COMPONENT) {
+ strb = st_renderbuffer(ctx->ReadBuffer->_DepthBuffer);
++ if (strb->Base.Wrapped) {
++ strb = st_renderbuffer(strb->Base.Wrapped);
++ }
+ }
+ else {
+ /* Read color buffer */
+diff --git a/src/mesa/state_tracker/st_mesa_to_tgsi.c b/src/mesa/state_tracker/st_mesa_to_tgsi.c
+index d7ef57e..d08af62 100644
+--- a/src/mesa/state_tracker/st_mesa_to_tgsi.c
++++ b/src/mesa/state_tracker/st_mesa_to_tgsi.c
+@@ -683,8 +683,12 @@ emit_adjusted_wpos( struct st_translate *t,
+ struct ureg_dst wpos_temp = ureg_DECL_temporary(ureg);
+ struct ureg_src wpos_input = t->inputs[t->inputMapping[FRAG_ATTRIB_WPOS]];
+
+- ureg_ADD(ureg, ureg_writemask(wpos_temp, TGSI_WRITEMASK_X | TGSI_WRITEMASK_Y),
+- wpos_input, ureg_imm1f(ureg, value));
++ /* Note that we bias X and Y and pass Z and W through unchanged.
++ * The shader might also use gl_FragCoord.w and .z.
++ */
++ ureg_ADD(ureg,
++ ureg_writemask(wpos_temp, TGSI_WRITEMASK_XYZW),
++ wpos_input, ureg_imm4f(ureg, value, value, 0.0f, 0.0f));
+
+ t->inputs[t->inputMapping[FRAG_ATTRIB_WPOS]] = ureg_src(wpos_temp);
+ }
+diff --git a/src/mesa/swrast/s_span.c b/src/mesa/swrast/s_span.c
+index 687c8eb..32d4f52 100644
+--- a/src/mesa/swrast/s_span.c
++++ b/src/mesa/swrast/s_span.c
+@@ -971,6 +971,10 @@ shade_texture_span(GLcontext *ctx, SWspan *span)
+ if (span->primitive == GL_BITMAP && span->array->ChanType != GL_FLOAT) {
+ convert_color_type(span, GL_FLOAT, 0);
+ }
++ else {
++ span->array->rgba = (void *) span->array->attribs[FRAG_ATTRIB_COL0];
++ }
++
+ if (span->primitive != GL_POINT ||
+ (span->interpMask & SPAN_RGBA) ||
+ ctx->Point.PointSprite) {
+@@ -1222,9 +1226,22 @@ _swrast_write_rgba_span( GLcontext *ctx, SWspan *span)
+ GLchan rgbaSave[MAX_WIDTH][4];
+ const GLuint fragOutput = multiFragOutputs ? buf : 0;
+
++ /* set span->array->rgba to colors for render buffer's datatype */
+ if (rb->DataType != span->array->ChanType || fragOutput > 0) {
+ convert_color_type(span, rb->DataType, fragOutput);
+ }
++ else {
++ if (rb->DataType == GL_UNSIGNED_BYTE) {
++ span->array->rgba = span->array->rgba8;
++ }
++ else if (rb->DataType == GL_UNSIGNED_SHORT) {
++ span->array->rgba = (void *) span->array->rgba16;
++ }
++ else {
++ span->array->rgba = (void *)
++ span->array->attribs[FRAG_ATTRIB_COL0];
++ }
++ }
+
+ if (!multiFragOutputs && numBuffers > 1) {
+ /* save colors for second, third renderbuffer writes */
+diff --git a/src/mesa/swrast_setup/ss_context.c b/src/mesa/swrast_setup/ss_context.c
+index ebd1574..0fcb7c7 100644
+--- a/src/mesa/swrast_setup/ss_context.c
++++ b/src/mesa/swrast_setup/ss_context.c
+@@ -115,7 +115,7 @@ setup_vertex_format(GLcontext *ctx)
+ GLboolean intColors = !ctx->FragmentProgram._Current
+ && !ctx->ATIFragmentShader._Enabled
+ && ctx->RenderMode == GL_RENDER
+- && CHAN_TYPE == GL_UNSIGNED_BYTE;
++ && CHAN_TYPE != GL_FLOAT;
+
+ if (intColors != swsetup->intColors ||
+ !RENDERINPUTS_EQUAL(tnl->render_inputs_bitset,
+diff --git a/src/mesa/swrast_setup/ss_triangle.c b/src/mesa/swrast_setup/ss_triangle.c
+index bad0d81..f22bc52 100644
+--- a/src/mesa/swrast_setup/ss_triangle.c
++++ b/src/mesa/swrast_setup/ss_triangle.c
+@@ -159,7 +159,7 @@ static void _swsetup_render_tri(GLcontext *ctx,
+ }
+
+ #define SS_COLOR(a,b) UNCLAMPED_FLOAT_TO_RGBA_CHAN(a,b)
+-#define SS_SPEC(a,b) UNCLAMPED_FLOAT_TO_RGB_CHAN(a,b)
++#define SS_SPEC(a,b) COPY_4V(a,b)
+ #define SS_IND(a,b) (a = b)
+
+ #define IND (0)