Merge branch 'master' of ssh://git.freedesktop.org/git/mesa/mesa into pipe-video
authorChristian König <deathsimple@vodafone.de>
Tue, 12 Oct 2010 21:05:25 +0000 (23:05 +0200)
committerChristian König <deathsimple@vodafone.de>
Tue, 12 Oct 2010 21:07:29 +0000 (23:07 +0200)
Conflicts:
configure.ac
src/gallium/drivers/nvfx/Makefile
src/gallium/include/pipe/p_defines.h
src/gallium/include/pipe/p_screen.h
src/gallium/include/state_tracker/dri1_api.h
src/gallium/include/state_tracker/drm_api.h
src/gallium/winsys/nouveau/drm/nouveau_drm_api.c

14 files changed:
1  2 
configure.ac
src/gallium/auxiliary/Makefile
src/gallium/auxiliary/SConscript
src/gallium/drivers/nvfx/Makefile
src/gallium/drivers/nvfx/nvfx_screen.c
src/gallium/drivers/nvfx/nvfx_state.h
src/gallium/drivers/softpipe/Makefile
src/gallium/drivers/softpipe/SConscript
src/gallium/drivers/softpipe/sp_screen.c
src/gallium/include/pipe/p_defines.h
src/gallium/include/pipe/p_format.h
src/gallium/include/pipe/p_screen.h
src/gallium/targets/dri-nouveau/Makefile
src/gallium/winsys/g3dvl/dri/XF86dri.c

diff --combined configure.ac
index 757bc1e8e78bb0faab82cc913b488edaea5c68ca,364ee0394703c38d5ef951f1915449a250a0340f..dec8a2674b93fd1b9a350896a4f5807d269d7f03
@@@ -4,7 -4,7 +4,7 @@@ AC_PREREQ([2.59]
  
  dnl Versioning - scrape the version from configs/default
  m4_define([mesa_version],
-     [m4_esyscmd([${MAKE-make} -s -f bin/version.mk version | tr -d '\n'])])
+     [m4_esyscmd([${MAKE-make} -s -f bin/version.mk version | tr -d '\n' | tr -d '\r'])])
  m4_ifval(mesa_version,,
      [m4_fatal([Failed to get the Mesa version from `make -f bin/version.mk version`])])
  
@@@ -33,6 -33,10 +33,10 @@@ AC_CHECK_PROGS([MAKE], [gmake make]
  AC_PATH_PROG([MKDEP], [makedepend])
  AC_PATH_PROG([SED], [sed])
  
+ if test "x$MKDEP" = "x"; then
+     AC_MSG_ERROR([makedepend is required to build Mesa])
+ fi
  dnl Our fallback install-sh is a symlink to minstall. Use the existing
  dnl configuration in that case.
  AC_PROG_INSTALL
@@@ -48,9 -52,23 +52,23 @@@ solaris*
      ;;
  esac
  
+ dnl clang is mostly GCC-compatible, but its version is much lower,
+ dnl so we have to check for it.
+ AC_MSG_CHECKING([if compiling with clang])
+ AC_COMPILE_IFELSE(
+ [AC_LANG_PROGRAM([], [[
+ #ifndef __clang__
+        not clang
+ #endif
+ ]])],
+ [CLANG=yes], [CLANG=no])
+ AC_MSG_RESULT([$CLANG])
  dnl If we're using GCC, make sure that it is at least version 3.3.0.  Older
  dnl versions are explictly not supported.
- if test "x$GCC" = xyes; then
+ if test "x$GCC" = xyes -a "x$CLANG" = xno; then
      AC_MSG_CHECKING([whether gcc version is sufficient])
      major=0
      minor=0
@@@ -123,7 -141,10 +141,10 @@@ esa
  
  dnl Add flags for gcc and g++
  if test "x$GCC" = xyes; then
-     CFLAGS="$CFLAGS -Wall -Wmissing-prototypes -std=c99 -ffast-math"
+     CFLAGS="$CFLAGS -Wall -Wmissing-prototypes -std=c99"
+     if test "x$CLANG" = "xno"; then
+        CFLAGS="$CFLAGS -ffast-math"
+     fi
  
      # Enable -fvisibility=hidden if using a gcc that supports it
      save_CFLAGS="$CFLAGS"
  if test "x$GXX" = xyes; then
      CXXFLAGS="$CXXFLAGS -Wall"
  
+     # Enable -fvisibility=hidden if using a gcc that supports it
+     save_CXXFLAGS="$CXXFLAGS"
+     AC_MSG_CHECKING([whether $CXX supports -fvisibility=hidden])
+     CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
+     AC_LINK_IFELSE([AC_LANG_PROGRAM()], AC_MSG_RESULT([yes]),
+                  [CXXFLAGS="$save_CXXFLAGS" ; AC_MSG_RESULT([no])]);
      # Work around aliasing bugs - developers should comment this out
      CXXFLAGS="$CXXFLAGS -fno-strict-aliasing"
  fi
@@@ -258,6 -286,8 +286,8 @@@ f
  dnl
  dnl library names
  dnl
+ LIB_PREFIX_GLOB='lib'
+ LIB_VERSION_SEPARATOR='.'
  if test "$enable_static" = yes; then
      LIB_EXTENSION='a'
  else
      darwin* )
          LIB_EXTENSION='dylib' ;;
      cygwin* )
+         dnl prefix can be 'cyg' or 'lib'
+         LIB_PREFIX_GLOB='???'
+         LIB_VERSION_SEPARATOR='-'
          LIB_EXTENSION='dll' ;;
      aix* )
          LIB_EXTENSION='a' ;;
@@@ -279,13 -312,20 +312,20 @@@ GLUT_LIB_NAME='lib$(GLUT_LIB).'${LIB_EX
  GLW_LIB_NAME='lib$(GLW_LIB).'${LIB_EXTENSION}
  OSMESA_LIB_NAME='lib$(OSMESA_LIB).'${LIB_EXTENSION}
  EGL_LIB_NAME='lib$(EGL_LIB).'${LIB_EXTENSION}
- GL_LIB_GLOB='lib$(GL_LIB).*'${LIB_EXTENSION}'*'
- GLU_LIB_GLOB='lib$(GLU_LIB).*'${LIB_EXTENSION}'*'
- GLUT_LIB_GLOB='lib$(GLUT_LIB).*'${LIB_EXTENSION}'*'
- GLW_LIB_GLOB='lib$(GLW_LIB).*'${LIB_EXTENSION}'*'
- OSMESA_LIB_GLOB='lib$(OSMESA_LIB).*'${LIB_EXTENSION}'*'
- EGL_LIB_GLOB='lib$(EGL_LIB).*'${LIB_EXTENSION}'*'
+ GLESv1_CM_LIB_NAME='lib$(GLESv1_CM_LIB).'${LIB_EXTENSION}
+ GLESv2_LIB_NAME='lib$(GLESv2_LIB).'${LIB_EXTENSION}
+ VG_LIB_NAME='lib$(VG_LIB).'${LIB_EXTENSION}
+ GL_LIB_GLOB=${LIB_PREFIX_GLOB}'$(GL_LIB)'${LIB_VERSION_SEPARATOR}'*'${LIB_EXTENSION}'*'
+ GLU_LIB_GLOB=${LIB_PREFIX_GLOB}'$(GLU_LIB)'${LIB_VERSION_SEPARATOR}'*'${LIB_EXTENSION}'*'
+ GLUT_LIB_GLOB=${LIB_PREFIX_GLOB}'$(GLUT_LIB)'${LIB_VERSION_SEPARATOR}'*'${LIB_EXTENSION}'*'
+ GLW_LIB_GLOB=${LIB_PREFIX_GLOB}'$(GLW_LIB)'${LIB_VERSION_SEPARATOR}'*'${LIB_EXTENSION}'*'
+ OSMESA_LIB_GLOB=${LIB_PREFIX_GLOB}'$(OSMESA_LIB)'${LIB_VERSION_SEPARATOR}'*'${LIB_EXTENSION}'*'
+ EGL_LIB_GLOB=${LIB_PREFIX_GLOB}'$(EGL_LIB)'${LIB_VERSION_SEPARATOR}'*'${LIB_EXTENSION}'*'
+ EGL_LIB_GLOB=${LIB_PREFIX_GLOB}'$(EGL_LIB)'${LIB_VERSION_SEPARATOR}'*'${LIB_EXTENSION}'*'
+ GLESv1_CM_LIB_GLOB=${LIB_PREFIX_GLOB}'$(GLESv1_CM_LIB)'${LIB_VERSION_SEPARATOR}'*'${LIB_EXTENSION}'*'
+ GLESv2_LIB_GLOB=${LIB_PREFIX_GLOB}'$(GLESv2_LIB)'${LIB_VERSION_SEPARATOR}'*'${LIB_EXTENSION}'*'
+ VG_LIB_GLOB=${LIB_PREFIX_GLOB}'$(VG_LIB)'${LIB_VERSION_SEPARATOR}'*'${LIB_EXTENSION}'*'
  
  AC_SUBST([GL_LIB_NAME])
  AC_SUBST([GLU_LIB_NAME])
@@@ -293,6 -333,9 +333,9 @@@ AC_SUBST([GLUT_LIB_NAME]
  AC_SUBST([GLW_LIB_NAME])
  AC_SUBST([OSMESA_LIB_NAME])
  AC_SUBST([EGL_LIB_NAME])
+ AC_SUBST([GLESv1_CM_LIB_NAME])
+ AC_SUBST([GLESv2_LIB_NAME])
+ AC_SUBST([VG_LIB_NAME])
  
  AC_SUBST([GL_LIB_GLOB])
  AC_SUBST([GLU_LIB_GLOB])
@@@ -300,6 -343,9 +343,9 @@@ AC_SUBST([GLUT_LIB_GLOB]
  AC_SUBST([GLW_LIB_GLOB])
  AC_SUBST([OSMESA_LIB_GLOB])
  AC_SUBST([EGL_LIB_GLOB])
+ AC_SUBST([GLESv1_CM_LIB_GLOB])
+ AC_SUBST([GLESv2_LIB_GLOB])
+ AC_SUBST([VG_LIB_GLOB])
  
  dnl
  dnl Arch/platform-specific settings
@@@ -398,6 -444,7 +444,7 @@@ dnl Check to see if dlopen is in defaul
  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"])
@@@ -450,19 -497,23 +497,23 @@@ xxlib|xdri|xosmesa
      ;;
  esac
  
+ PKG_CHECK_MODULES([TALLOC], [talloc])
+ AC_SUBST([TALLOC_LIBS])
+ AC_SUBST([TALLOC_CFLAGS])
  dnl
  dnl Driver specific build directories
  dnl
  
  dnl this variable will be prepended to SRC_DIRS and is not exported
- CORE_DIRS="glsl mesa"
+ CORE_DIRS="mapi/glapi glsl mesa"
  
- SRC_DIRS="glew"
+ SRC_DIRS=""
  GLU_DIRS="sgi"
  GALLIUM_DIRS="auxiliary drivers state_trackers"
  GALLIUM_TARGET_DIRS=""
  GALLIUM_WINSYS_DIRS="sw"
- GALLIUM_DRIVERS_DIRS="softpipe failover trace identity"
+ GALLIUM_DRIVERS_DIRS="softpipe failover galahad trace rbug identity"
  GALLIUM_STATE_TRACKERS_DIRS=""
  
  case "$mesa_driver" in
@@@ -474,7 -525,7 +525,7 @@@ xlib
  dri)
      SRC_DIRS="$SRC_DIRS glx"
      DRIVER_DIRS="dri"
-     GALLIUM_WINSYS_DIRS="$GALLIUM_WINSYS_DIRS sw/xlib sw/dri sw/drm"
+     GALLIUM_WINSYS_DIRS="$GALLIUM_WINSYS_DIRS sw/xlib sw/dri"
      ;;
  osmesa)
      DRIVER_DIRS="osmesa"
@@@ -490,45 -541,6 +541,6 @@@ AC_SUBST([GALLIUM_DRIVERS_DIRS]
  AC_SUBST([GALLIUM_STATE_TRACKERS_DIRS])
  AC_SUBST([MESA_LLVM])
  
- dnl
- dnl User supplied program configuration
- dnl
- if test -d "$srcdir/progs/demos"; then
-     default_demos=yes
- else
-     default_demos=no
- fi
- AC_ARG_WITH([demos],
-     [AS_HELP_STRING([--with-demos@<:@=DIRS...@:>@],
-         [optional comma delimited demo directories to build
-         @<:@default=auto if source available@:>@])],
-     [with_demos="$withval"],
-     [with_demos="$default_demos"])
- if test "x$with_demos" = x; then
-     with_demos=no
- fi
- dnl If $with_demos is yes, directories will be added as libs available
- PROGRAM_DIRS=""
- case "$with_demos" in
- no) ;;
- yes)
-     # If the driver isn't osmesa, we have libGL and can build xdemos
-     if test "$mesa_driver" != osmesa; then
-         PROGRAM_DIRS="xdemos"
-     fi
-     ;;
- *)
-     # verify the requested demos directories exist
-     demos=`IFS=,; echo $with_demos`
-     for demo in $demos; do
-         test -d "$srcdir/progs/$demo" || \
-             AC_MSG_ERROR([Program directory '$demo' doesn't exist])
-     done
-     PROGRAM_DIRS="$demos"
-     ;;
- esac
  dnl
  dnl Find out if X is available. The variable have_x is set if libX11 is
  dnl found to mimic AC_PATH_XTRA.
@@@ -600,8 -612,8 +612,8 @@@ xlib
          GL_PC_LIB_PRIV="$GL_LIB_DEPS"
          GL_PC_CFLAGS="$X11_INCLUDES"
      fi
-     GL_LIB_DEPS="$GL_LIB_DEPS $SELINUX_LIBS -lm -lpthread"
-     GL_PC_LIB_PRIV="$GL_PC_LIB_PRIV $SELINUX_LIBS -lm -lpthread"
+     GL_LIB_DEPS="$GL_LIB_DEPS $SELINUX_LIBS -lm -lpthread $TALLOC_LIBS"
+     GL_PC_LIB_PRIV="$GL_PC_LIB_PRIV $SELINUX_LIBS -lm -lpthread $TALLOC_LIBS"
  
      # if static, move the external libraries to the programs
      # and empty the libraries for libGL
@@@ -625,8 -637,15 +637,15 @@@ dri
  
      # find the DRI deps for libGL
      if test "$x11_pkgconfig" = yes; then
+         dri_modules="x11 xext xdamage xfixes"
+         # add xf86vidmode if available
+         PKG_CHECK_MODULES([XF86VIDMODE], [xxf86vm], HAVE_XF86VIDMODE=yes, HAVE_XF86VIDMODE=no)
+         if test "$HAVE_XF86VIDMODE" = yes ; then
+             dri_modules="$dri_modules xxf86vm"
+         fi
          # add xcb modules if necessary
-         dri_modules="x11 xext xxf86vm xdamage xfixes"
          if test "$enable_xcb" = yes; then
              dri_modules="$dri_modules x11-xcb xcb-glx"
          fi
      # need DRM libs, -lpthread, etc.
      GL_LIB_DEPS="$GL_LIB_DEPS $LIBDRM_LIBS -lm -lpthread $DLOPEN_LIBS"
      GL_PC_LIB_PRIV="-lm -lpthread $DLOPEN_LIBS"
+     GLESv1_CM_LIB_DEPS="$LIBDRM_LIBS -lm -lpthread $DLOPEN_LIBS"
+     GLESv1_CM_PC_LIB_PRIV="-lm -lpthread $DLOPEN_LIBS"
+     GLESv2_LIB_DEPS="$LIBDRM_LIBS -lm -lpthread $DLOPEN_LIBS"
+     GLESv2_PC_LIB_PRIV="-lm -lpthread $DLOPEN_LIBS"
      ;;
  osmesa)
      # No libGL for osmesa
@@@ -665,6 -688,18 +688,18 @@@ AC_SUBST([GL_PC_REQ_PRIV]
  AC_SUBST([GL_PC_LIB_PRIV])
  AC_SUBST([GL_PC_CFLAGS])
  AC_SUBST([DRI_PC_REQ_PRIV])
+ AC_SUBST([GLESv1_CM_LIB_DEPS])
+ AC_SUBST([GLESv1_CM_PC_LIB_PRIV])
+ AC_SUBST([GLESv2_LIB_DEPS])
+ AC_SUBST([GLESv2_PC_LIB_PRIV])
+ AC_SUBST([HAVE_XF86VIDMODE])
+ PKG_CHECK_MODULES([LIBDRM_RADEON],
+                 [libdrm_radeon libdrm >= $LIBDRM_RADEON_REQUIRED],
+                 HAVE_LIBDRM_RADEON=yes,
+                 HAVE_LIBDRM_RADEON=no)
  
  dnl
  dnl More X11 setup
@@@ -698,7 -733,7 +733,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
@@@ -712,6 -747,51 +747,51 @@@ if test "x$with_dri_drivers" = x; the
      with_dri_drivers=no
  fi
  
+ dnl Determine which APIs to support
+ AC_ARG_ENABLE([opengl],
+     [AS_HELP_STRING([--disable-opengl],
+         [disable support for standard OpenGL API @<:@default=no@:>@])],
+     [enable_opengl="$enableval"],
+     [enable_opengl=yes])
+ AC_ARG_ENABLE([gles1],
+     [AS_HELP_STRING([--enable-gles1],
+         [enable support for OpenGL ES 1.x API @<:@default=no@:>@])],
+     [enable_gles1="$enableval"],
+     [enable_gles1=no])
+ AC_ARG_ENABLE([gles2],
+     [AS_HELP_STRING([--enable-gles2],
+         [enable support for OpenGL ES 2.x API @<:@default=no@:>@])],
+     [enable_gles2="$enableval"],
+     [enable_gles2=no])
+ AC_ARG_ENABLE([gles-overlay],
+     [AS_HELP_STRING([--enable-gles-overlay],
+         [build separate OpenGL ES only libraries @<:@default=no@:>@])],
+     [enable_gles_overlay="$enableval"],
+     [enable_gles_overlay=no])
+ API_DEFINES=""
+ GLES_OVERLAY=0
+ if test "x$enable_opengl" = xno; then
+     API_DEFINES="$API_DEFINES -DFEATURE_GL=0"
+ else
+     API_DEFINES="$API_DEFINES -DFEATURE_GL=1"
+ fi
+ if test "x$enable_gles1" = xyes; then
+     API_DEFINES="$API_DEFINES -DFEATURE_ES1=1"
+ fi
+ if test "x$enable_gles2" = xyes; then
+     API_DEFINES="$API_DEFINES -DFEATURE_ES2=1"
+ fi
+ if test "x$enable_gles_overlay" = xyes -o \
+     "x$enable_gles1" = xyes -o "x$enable_gles2" = xyes; then
+     CORE_DIRS="mapi/es1api mapi/es2api $CORE_DIRS"
+     if test "x$enable_gles_overlay" = xyes; then
+         GLES_OVERLAY=1
+     fi
+ fi
+ AC_SUBST([API_DEFINES])
+ AC_SUBST([GLES_OVERLAY])
  dnl If $with_dri_drivers is yes, directories will be added through
  dnl platform checks
  DRI_DIRS=""
@@@ -825,7 -905,7 +905,7 @@@ if test "$mesa_driver" = dri; the
          [AC_MSG_ERROR([Expat required for DRI.])])
  
      # put all the necessary libs together
-     DRI_LIB_DEPS="$SELINUX_LIBS $LIBDRM_LIBS $EXPAT_LIB -lm -lpthread $DLOPEN_LIBS"
+     DRI_LIB_DEPS="$SELINUX_LIBS $LIBDRM_LIBS $EXPAT_LIB -lm -lpthread $DLOPEN_LIBS $TALLOC_LIBS"
  fi
  AC_SUBST([DRI_DIRS])
  AC_SUBST([EXPAT_INCLUDES])
@@@ -833,18 -913,13 +913,13 @@@ AC_SUBST([DRI_LIB_DEPS]
  
  case $DRI_DIRS in
  *i915*|*i965*)
-     PKG_CHECK_MODULES([INTEL], [libdrm_intel >= 2.4.19])
+     PKG_CHECK_MODULES([INTEL], [libdrm_intel >= 2.4.21])
      ;;
  esac
  
  case $DRI_DIRS in
  *radeon*|*r200*|*r300*|*r600*)
-     PKG_CHECK_MODULES([LIBDRM_RADEON],
-                     [libdrm_radeon libdrm >= $LIBDRM_RADEON_REQUIRED],
-                     HAVE_LIBDRM_RADEON=yes,
-                     HAVE_LIBDRM_RADEON=no)
-     if test "$HAVE_LIBDRM_RADEON" = yes; then
+     if test "x$HAVE_LIBDRM_RADEON" = xyes; then
        RADEON_CFLAGS="-DHAVE_LIBDRM_RADEON=1 $LIBDRM_RADEON_CFLAGS"
        RADEON_LDFLAGS=$LIBDRM_RADEON_LIBS
      fi
@@@ -864,7 -939,7 +939,7 @@@ els
  fi
  AC_ARG_ENABLE([gl-osmesa],
      [AS_HELP_STRING([--enable-gl-osmesa],
-         [enable OSMesa on libGL @<:@default=enabled for xlib driver@:>@])],
+         [enable OSMesa with libGL @<:@default=enabled for xlib driver@:>@])],
      [gl_osmesa="$enableval"],
      [gl_osmesa="$default_gl_osmesa"])
  if test "x$gl_osmesa" = xyes; then
@@@ -899,30 -974,18 +974,18 @@@ x16|x32
  esac
  AC_SUBST([OSMESA_LIB])
  
- case "$mesa_driver" in
osmesa)
+ case "$DRIVER_DIRS" in
*osmesa*)
      # only link libraries with osmesa if shared
      if test "$enable_static" = no; then
-         OSMESA_LIB_DEPS="-lm -lpthread $SELINUX_LIBS $DLOPEN_LIBS"
+         OSMESA_LIB_DEPS="-lm -lpthread $SELINUX_LIBS $DLOPEN_LIBS $TALLOC_LIBS"
      else
          OSMESA_LIB_DEPS=""
      fi
      OSMESA_MESA_DEPS=""
-     OSMESA_PC_LIB_PRIV="-lm -lpthread $SELINUX_LIBS $DLOPEN_LIBS"
-     ;;
- *)
-     # Link OSMesa to libGL otherwise
-     OSMESA_LIB_DEPS=""
-     # only link libraries with osmesa if shared
-     if test "$enable_static" = no; then
-         OSMESA_MESA_DEPS='-l$(GL_LIB)'
-     else
-         OSMESA_MESA_DEPS=""
-     fi
-     OSMESA_PC_REQ="gl"
+     OSMESA_PC_LIB_PRIV="-lm -lpthread $SELINUX_LIBS $DLOPEN_LIBS $TALLOC_LIBS"
      ;;
  esac
- OSMESA_PC_LIB_PRIV="$OSMESA_PC_LIB_PRIV"
  AC_SUBST([OSMESA_LIB_DEPS])
  AC_SUBST([OSMESA_MESA_DEPS])
  AC_SUBST([OSMESA_PC_REQ])
@@@ -946,16 -1009,23 +1009,23 @@@ if test "x$enable_egl" = xyes; the
              EGL_DRIVERS_DIRS="glx"
          fi
  
-         # build egl_dri2 when xcb-dri2 is available
-         PKG_CHECK_MODULES([EGL_DRI2], [x11-xcb xcb-dri2 xcb-xfixes libdrm],
-                         [have_xcb_dri2=yes],[have_xcb_dri2=no])
-         if test "$have_xcb_dri2" = yes; then
-             EGL_DRIVERS_DIRS="$EGL_DRIVERS_DIRS dri2"
-         fi
-     fi
+         if test "$mesa_driver" = dri; then
+             # build egl_dri2 when xcb-dri2 is available
+             PKG_CHECK_MODULES([XCB_DRI2], [x11-xcb xcb-dri2 xcb-xfixes],
+                         [have_xcb_dri2=yes],[have_xcb_dri2=no])
+             PKG_CHECK_MODULES([LIBUDEV], [libudev > 150],
+                         [have_libudev=yes],[have_libudev=no])
+             
+             if test "$have_xcb_dri2" = yes; then
+                 EGL_DRIVER_DRI2=dri2
+                 DEFINES="$DEFINES -DHAVE_XCB_DRI2"
+                 if test "$have_libudev" = yes; then
+                     DEFINES="$DEFINES -DHAVE_LIBUDEV"
+                 fi
+             fi
+       fi
  
-     if test "$with_demos" = yes; then
-         PROGRAM_DIRS="$PROGRAM_DIRS egl/eglut egl/opengl"
+         EGL_DRIVERS_DIRS="$EGL_DRIVERS_DIRS $EGL_DRIVER_DRI2"
      fi
  fi
  AC_SUBST([EGL_LIB_DEPS])
@@@ -974,12 -1044,6 +1044,6 @@@ if test "x$enable_glu" = xyes; the
  
      case "$mesa_driver" in
      osmesa)
-         # If GLU is available and we have libOSMesa (not 16 or 32),
-         # we can build the osdemos
-         if test "$with_demos" = yes && test "$osmesa_bits" = 8; then
-             PROGRAM_DIRS="$PROGRAM_DIRS osdemos"
-         fi
          # Link libGLU to libOSMesa instead of libGL
          GLU_LIB_DEPS=""
          GLU_PC_REQ="osmesa"
  
  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"
          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"
  
-     # If glut is available, we can build most programs
-     if test "$with_demos" = yes; then
-         PROGRAM_DIRS="$PROGRAM_DIRS demos redbook samples glsl"
-     fi
      # If static, empty GLUT_LIB_DEPS and add libs for programs to link
      if test "$enable_static" = no; then
          GLUT_MESA_DEPS='-l$(GLU_LIB) -l$(GL_LIB)'
@@@ -1192,6 -1250,12 +1250,12 @@@ AC_SUBST([LLVM_LIBS]
  AC_SUBST([LLVM_LDFLAGS])
  AC_SUBST([LLVM_VERSION])
  
+ VG_LIB_DEPS=""
+ EGL_CLIENT_APIS='$(GL_LIB)'
+ if test "x$enable_gles_overlay" = xyes; then
+     EGL_CLIENT_APIS="$EGL_CLIENT_APIS "'$(GLESv1_CM_LIB) $(GLESv2_LIB)'
+ fi
  dnl
  dnl Gallium state trackers configuration
  dnl
@@@ -1228,11 -1292,9 +1292,9 @@@ yes
      ;;
  *)
      # verify the requested state tracker exist
-     state_trackers=`IFS=', '; echo $with_state_trackers`
-     for tracker in $state_trackers; do
-         test -d "$srcdir/src/gallium/state_trackers/$tracker" || \
-             AC_MSG_ERROR([state tracker '$tracker' doesn't exist])
+     state_trackers=""
+     _state_trackers=`IFS=', '; echo $with_state_trackers`
+     for tracker in $_state_trackers; do
          case "$tracker" in
          dri)
              if test "x$mesa_driver" != xdri; then
              HAVE_ST_EGL="yes"
              ;;
          xorg)
+             PKG_CHECK_MODULES([XORG], [xorg-server >= 1.6.0])
              PKG_CHECK_MODULES([LIBDRM_XORG], [libdrm >= $LIBDRM_XORG_REQUIRED])
              PKG_CHECK_MODULES([LIBKMS_XORG], [libkms >= $LIBKMS_XORG_REQUIRED])
              HAVE_ST_XORG="yes"
              ;;
          es)
-             # mesa/es is required to build es state tracker
-             CORE_DIRS="$CORE_DIRS mesa/es"
+             AC_MSG_WARN([state tracker 'es' has been replaced by --enable-gles-overlay])
+             if test "x$enable_gles_overlay" != xyes; then
+                 if test "x$enable_gles1" != xyes -a "x$enable_gles2" != xyes; then
+                     CORE_DIRS="mapi/es1api mapi/es2api $CORE_DIRS"
+                 fi
+                 GLES_OVERLAY=1
+                 EGL_CLIENT_APIS="$EGL_CLIENT_APIS "'$(GLESv1_CM_LIB) $(GLESv2_LIB)'
+             fi
+           tracker=""
+             ;;
+         vega)
+             CORE_DIRS="$CORE_DIRS mapi/vgapi"
+             VG_LIB_DEPS="$VG_LIB_DEPS -lpthread"
+             EGL_CLIENT_APIS="$EGL_CLIENT_APIS "'$(VG_LIB)'
              ;;
 +        xorg/xvmc)
 +            # Check for libXvMC?
 +            if test "x$enable_gallium_g3dvl" != xyes; then
 +                AC_MSG_ERROR([cannot build XvMC state tracker without --enable-gallium-g3dvl])
 +            fi
 +            HAVE_ST_XVMC="yes"
 +            ;;
          esac
+       if test -n "$tracker"; then
+             test -d "$srcdir/src/gallium/state_trackers/$tracker" || \
+                 AC_MSG_ERROR([state tracker '$tracker' doesn't exist])
+             if test -n "$state_trackers"; then
+                 state_trackers="$state_trackers $tracker"
+             else
+                 state_trackers="$tracker"
+             fi
+         fi
      done
      GALLIUM_STATE_TRACKERS_DIRS="$state_trackers"
      ;;
  esac
  
+ AC_SUBST([VG_LIB_DEPS])
+ AC_SUBST([EGL_CLIENT_APIS])
+ if test "x$HAVE_ST_EGL" = xyes; then
+       GALLIUM_TARGET_DIRS="$GALLIUM_TARGET_DIRS egl"
+       # 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
+ fi
  if test "x$HAVE_ST_XORG" = xyes; then
      PKG_CHECK_MODULES(XEXT, [xextproto >= 7.0.99.1],
          HAVE_XEXTPROTO_71="yes"; DEFINES="$DEFINES -DHAVE_XEXTPROTO_71",
          HAVE_XEXTPROTO_71="no")
  fi
  
+ AC_ARG_WITH([egl-platforms],
+     [AS_HELP_STRING([--with-egl-platforms@<:@=DIRS...@:>@],
+         [comma delimited native platforms libEGL supports, e.g.
+         "x11,drm" @<:@default=auto@:>@])],
+     [with_egl_platforms="$withval"],
+     [with_egl_platforms=yes])
  AC_ARG_WITH([egl-displays],
      [AS_HELP_STRING([--with-egl-displays@<:@=DIRS...@:>@],
-         [comma delimited native displays libEGL supports, e.g.
-         "x11,kms" @<:@default=auto@:>@])],
-     [with_egl_displays="$withval"],
-     [with_egl_displays=yes])
+         [DEPRECATED.  Use --with-egl-platforms instead])],
+     [with_egl_platforms="$withval"])
  
- EGL_DISPLAYS=""
- case "$with_egl_displays" in
+ EGL_PLATFORMS=""
+ case "$with_egl_platforms" in
  yes)
      if test "x$enable_egl" = xyes && test "x$mesa_driver" != xosmesa; then
-         EGL_DISPLAYS="x11"
+         EGL_PLATFORMS="x11"
+         if test "$mesa_driver" = dri; then
+             EGL_PLATFORMS="$EGL_PLATFORMS drm"
+         fi
      fi
      ;;
  *)
          AC_MSG_ERROR([cannot build egl state tracker without EGL library])
      fi
      # verify the requested driver directories exist
-     egl_displays=`IFS=', '; echo $with_egl_displays`
-     for dpy in $egl_displays; do
-         test -d "$srcdir/src/gallium/state_trackers/egl/$dpy" || \
-             AC_MSG_ERROR([EGL display '$dpy' does't exist])
+     egl_platforms=`IFS=', '; echo $with_egl_platforms`
+     for plat in $egl_platforms; do
+         test -d "$srcdir/src/gallium/state_trackers/egl/$plat" || \
+             AC_MSG_ERROR([EGL platform '$plat' does't exist])
+         if test "$plat" = "fbdev"; then
+                 GALLIUM_WINSYS_DIRS="$GALLIUM_WINSYS_DIRS sw/fbdev"
+         fi
      done
-     EGL_DISPLAYS="$egl_displays"
+     EGL_PLATFORMS="$egl_platforms"
      ;;
  esac
- AC_SUBST([EGL_DISPLAYS])
+ AC_SUBST([EGL_PLATFORMS])
  
  AC_ARG_WITH([egl-driver-dir],
      [AS_HELP_STRING([--with-egl-driver-dir=DIR],
@@@ -1352,7 -1452,7 +1459,7 @@@ if test "x$enable_gallium_llvm" = xyes
        fi
        LLVM_LDFLAGS=`$LLVM_CONFIG --ldflags`
        GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS llvmpipe"
-       DEFINES="$DEFINES -DMESA_LLVM -D__STDC_CONSTANT_MACROS"
+       DEFINES="$DEFINES -DGALLIUM_LLVMPIPE -D__STDC_CONSTANT_MACROS"
        MESA_LLVM=1
      else
        MESA_LLVM=0
  dnl Gallium helper functions
  dnl
  gallium_check_st() {
-     if test "x$HAVE_ST_DRI" = xyes || test "x$HAVE_ST_EGL" = xyes || test "x$HAVE_ST_XORG" = xyes || test "x$HAVE_ST_XVMC" = xyes; then
 -    if test "x$HAVE_ST_DRI" = xyes || test "x$HAVE_ST_XORG" = xyes; then
++    if test "x$HAVE_ST_DRI" = xyes || test "x$HAVE_ST_XORG" = xyes || test "x$HAVE_ST_XVMC" = xyes; then
           GALLIUM_WINSYS_DIRS="$GALLIUM_WINSYS_DIRS $1"
      fi
      if test "x$HAVE_ST_DRI" = xyes && test "x$2" != x; then
           GALLIUM_TARGET_DIRS="$GALLIUM_TARGET_DIRS $2"
      fi
-     if test "x$HAVE_ST_EGL" = xyes && test "x$3" != x; then
+     if test "x$HAVE_ST_XORG" = xyes && test "x$3" != x; then
           GALLIUM_TARGET_DIRS="$GALLIUM_TARGET_DIRS $3"
      fi
-     if test "x$HAVE_ST_XORG" = xyes && test "x$4" != x; then
-          GALLIUM_TARGET_DIRS="$GALLIUM_TARGET_DIRS $4"
-     fi
 +    if test "x$HAVE_ST_XVMC" = xyes && test "x$5" != x; then
 +         GALLIUM_TARGET_DIRS="$GALLIUM_TARGET_DIRS $5"
 +    fi
  }
  
  
@@@ -1393,41 -1487,83 +1497,83 @@@ AC_ARG_ENABLE([gallium-svga]
      [enable_gallium_svga=auto])
  if test "x$enable_gallium_svga" = xyes; then
      GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS svga"
-     gallium_check_st "svga/drm" "dri-vmwgfx" "egl-vmwgfx" "xorg-vmwgfx"
+     gallium_check_st "svga/drm" "dri-vmwgfx" "xorg-vmwgfx"
  elif test "x$enable_gallium_svga" = xauto; then
      GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS svga"
  fi
  
  dnl
- dnl Gallium Intel configuration
+ dnl Gallium i915 configuration
  dnl
- AC_ARG_ENABLE([gallium-intel],
-     [AS_HELP_STRING([--enable-gallium-intel],
-         [build gallium intel @<:@default=disabled@:>@])],
-     [enable_gallium_intel="$enableval"],
-     [enable_gallium_intel=auto])
- if test "x$enable_gallium_intel" = xyes; then
+ AC_ARG_ENABLE([gallium-i915],
+     [AS_HELP_STRING([--enable-gallium-i915],
+         [build gallium i915 @<:@default=disabled@:>@])],
+     [enable_gallium_i915="$enableval"],
+     [enable_gallium_i915=auto])
+ if test "x$enable_gallium_i915" = xyes; then
      GALLIUM_WINSYS_DIRS="$GALLIUM_WINSYS_DIRS i915/sw"
-     GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS i915 i965"
-     gallium_check_st "i915/drm i965/drm" "dri-i915 dri-i965" "egl-i915 egl-i965" "xorg-i915 xorg-i965"
- elif test "x$enable_gallium_intel" = xauto; then
+     GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS i915"
+     gallium_check_st "i915/drm" "dri-i915" "xorg-i915"
+ elif test "x$enable_gallium_i915" = xauto; then
      GALLIUM_WINSYS_DIRS="$GALLIUM_WINSYS_DIRS i915/sw"
-     GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS i915 i965"
+     GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS i915"
  fi
  
  dnl
- dnl Gallium Radeon configuration
+ dnl Gallium i965 configuration
+ dnl
+ AC_ARG_ENABLE([gallium-i965],
+     [AS_HELP_STRING([--enable-gallium-i965],
+         [build gallium i965 @<:@default=disabled@:>@])],
+     [enable_gallium_i965="$enableval"],
+     [enable_gallium_i965=auto])
+ if test "x$enable_gallium_i965" = xyes; then
+     GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS i965"
+     gallium_check_st "i965/drm" "dri-i965" "xorg-i965"
+ elif test "x$enable_gallium_i965" = xauto; then
+     GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS i965"
+ fi
+ dnl
+ dnl Gallium Radeon r300g configuration
  dnl
  AC_ARG_ENABLE([gallium-radeon],
      [AS_HELP_STRING([--enable-gallium-radeon],
          [build gallium radeon @<:@default=disabled@:>@])],
      [enable_gallium_radeon="$enableval"],
      [enable_gallium_radeon=auto])
+ if test "x$enable_gallium_radeon" = xauto; then
+     if test "x$HAVE_LIBDRM_RADEON" = xyes; then
+       GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS r300"
+       gallium_check_st "radeon/drm" "dri-r300"
+     else
+       AC_MSG_WARN([libdrm_radeon is missing, not building gallium-radeon (r300)])
+     fi
+ fi
  if test "x$enable_gallium_radeon" = xyes; then
-     GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS r300"
-     gallium_check_st "radeon/drm" "dri-radeong" "egl-radeon" "xorg-radeon"
- elif test "x$enable_gallium_radeon" = xauto; then
-     GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS r300"
+     if test "x$HAVE_LIBDRM_RADEON" = xyes; then
+       GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS r300"
+       gallium_check_st "radeon/drm" "dri-r300" "xorg-radeon"
+     else
+       AC_MSG_ERROR([libdrm_radeon is missing, cannot build gallium-radeon (r300)])
+     fi
+ fi
+ dnl
+ dnl Gallium Radeon r600g configuration
+ dnl
+ AC_ARG_ENABLE([gallium-r600],
+     [AS_HELP_STRING([--enable-gallium-r600],
+         [build gallium radeon @<:@default=disabled@:>@])],
+     [enable_gallium_r600="$enableval"],
+     [enable_gallium_r600=auto])
+ if test "x$enable_gallium_r600" = xyes; then
+     if test "x$HAVE_LIBDRM_RADEON" = xyes; then
+       GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS r600"
+       gallium_check_st "r600/drm" "dri-r600"
+     else
+       AC_MSG_ERROR([libdrm_radeon is missing, cannot build gallium-r600])
+     fi
  fi
  
  dnl
@@@ -1440,26 -1576,7 +1586,26 @@@ AC_ARG_ENABLE([gallium-nouveau]
      [enable_gallium_nouveau=no])
  if test "x$enable_gallium_nouveau" = xyes; then
      GALLIUM_DRIVERS_DIRS="$GALLIUM_DRIVERS_DIRS nouveau nvfx nv50"
-     gallium_check_st "nouveau/drm" "dri-nouveau" "egl-nouveau" "xorg-nouveau" "xvmc-nouveau"
 -    gallium_check_st "nouveau/drm" "dri-nouveau" "xorg-nouveau"
++    gallium_check_st "nouveau/drm" "dri-nouveau" "xorg-nouveau" "xvmc-nouveau"
 +fi
 +
 +dnl
 +dnl Gallium G3DVL configuration
 +dnl
 +AC_ARG_ENABLE([gallium-g3dvl],
 +    [AS_HELP_STRING([--enable-gallium-g3dvl],
 +        [build gallium g3dvl @<:@default=disabled@:>@])],
 +    [enable_gallium_g3dvl="$enableval"],
 +    [enable_gallium_g3dvl=no])
 +if test "x$enable_gallium_g3dvl" = xyes; then
 +    case "$mesa_driver" in
 +    xlib)
 +        GALLIUM_TARGET_DIRS="$GALLIUM_TARGET_DIRS xvmc-softpipe"
 +        ;;
 +    dri)
 +        GALLIUM_WINSYS_DIRS="$GALLIUM_WINSYS_DIRS g3dvl/dri"
 +        ;;
 +    esac
  fi
  
  dnl
@@@ -1474,9 -1591,6 +1620,6 @@@ if test "x$enable_gallium_swrast" = xye
      if test "x$HAVE_ST_DRI" = xyes; then
          GALLIUM_TARGET_DIRS="$GALLIUM_TARGET_DIRS dri-swrast"
      fi
-     if test "x$HAVE_ST_EGL" = xyes; then
-         GALLIUM_TARGET_DIRS="$GALLIUM_TARGET_DIRS egl-swrast"
-     fi
  fi
  
  dnl prepend CORE_DIRS to SRC_DIRS
  echo "        Use XCB:         $enable_xcb"
  
  echo ""
- if test "x$MESA_LLVM" == x1; then
+ if test "x$MESA_LLVM" = x1; then
      echo "        llvm:            yes"
      echo "        llvm-config:     $LLVM_CONFIG"
      echo "        llvm-version:    $LLVM_VERSION"
@@@ -1545,6 -1659,9 +1688,9 @@@ if echo "$SRC_DIRS" | grep 'gallium' >/
      echo "        Winsys dirs:     $GALLIUM_WINSYS_DIRS"
      echo "        Driver dirs:     $GALLIUM_DRIVERS_DIRS"
      echo "        Trackers dirs:   $GALLIUM_STATE_TRACKERS_DIRS"
+     if test "x$HAVE_ST_EGL" = xyes; then
+         echo "        EGL client APIs: $EGL_CLIENT_APIS"
+     fi
  else
      echo "        Gallium:         no"
  fi
@@@ -1555,6 -1672,7 +1701,7 @@@ echo "        Shared libs:     $enable_
  echo "        Static libs:     $enable_static"
  if test "$enable_egl" = yes; then
      echo "        EGL:             $EGL_DRIVERS_DIRS"
+     echo "        EGL platforms:   $EGL_PLATFORMS"
  else
      echo "        EGL:             no"
  fi
@@@ -1562,15 -1680,6 +1709,6 @@@ echo "        GLU:             $enable_
  echo "        GLw:             $enable_glw (Motif: $enable_motif)"
  echo "        glut:            $enable_glut"
  
- dnl Programs
- # cleanup the programs var for display
- program_dirs=`echo $PROGRAM_DIRS | $SED 's/^ *//;s/  */ /;s/ *$//'`
- if test "x$program_dirs" = x; then
-     echo "        Demos:           no"
- else
-     echo "        Demos:           $program_dirs"
- fi
  dnl Compiler options
  # cleanup the CFLAGS/CXXFLAGS/DEFINES vars
  cflags=`echo $CFLAGS $OPT_FLAGS $PIC_FLAGS $ARCH_FLAGS | \
index 16bb50fe168b29016e204d9e964dd2f13ff8bcbd,02af4d9280a69835bef04611eccc30da3a1d6e9f..05096b12a86f984c55e1f4abb6f20bf732910d3a
@@@ -4,10 -4,11 +4,11 @@@ include $(TOP)/configs/curren
  LIBNAME = gallium
  
  C_SOURCES = \
-       cso_cache/cso_context.c \
        cso_cache/cso_cache.c \
+       cso_cache/cso_context.c \
        cso_cache/cso_hash.c \
        draw/draw_context.c \
+       draw/draw_fs.c \
        draw/draw_gs.c \
        draw/draw_pipe.c \
        draw/draw_pipe_aaline.c \
        draw/draw_pipe_wide_line.c \
        draw/draw_pipe_wide_point.c \
        draw/draw_pt.c \
-       draw/draw_pt_elts.c \
        draw/draw_pt_emit.c \
        draw/draw_pt_fetch.c \
        draw/draw_pt_fetch_emit.c \
        draw/draw_pt_fetch_shade_emit.c \
        draw/draw_pt_fetch_shade_pipeline.c \
        draw/draw_pt_post_vs.c \
+       draw/draw_pt_so_emit.c \
        draw/draw_pt_util.c \
-       draw/draw_pt_varray.c \
-       draw/draw_pt_vcache.c \
+       draw/draw_pt_vsplit.c \
        draw/draw_vertex.c \
        draw/draw_vs.c \
-       draw/draw_vs_varient.c \
        draw/draw_vs_aos.c \
        draw/draw_vs_aos_io.c \
        draw/draw_vs_aos_machine.c \
        draw/draw_vs_exec.c \
        draw/draw_vs_ppc.c \
        draw/draw_vs_sse.c \
+       draw/draw_vs_varient.c \
        indices/u_indices_gen.c \
        indices/u_unfilled_gen.c \
        os/os_misc.c \
+       os/os_stream.c \
        os/os_stream_log.c \
+       os/os_stream_null.c \
        os/os_stream_stdc.c \
        os/os_stream_str.c \
-       os/os_stream_null.c \
        os/os_time.c \
        pipebuffer/pb_buffer_fenced.c \
        pipebuffer/pb_buffer_malloc.c \
        pipebuffer/pb_bufmgr_slab.c \
        pipebuffer/pb_validate.c \
        rbug/rbug_connection.c \
+       rbug/rbug_context.c \
        rbug/rbug_core.c \
+       rbug/rbug_demarshal.c \
        rbug/rbug_texture.c \
-       rbug/rbug_context.c \
        rbug/rbug_shader.c \
-       rbug/rbug_demarshal.c \
        rtasm/rtasm_cpu.c \
        rtasm/rtasm_execmem.c \
-       rtasm/rtasm_x86sse.c \
        rtasm/rtasm_ppc.c \
        rtasm/rtasm_ppc_spe.c \
-       tgsi/tgsi_sanity.c \
+       rtasm/rtasm_x86sse.c \
        tgsi/tgsi_build.c \
        tgsi/tgsi_dump.c \
        tgsi/tgsi_exec.c \
        tgsi/tgsi_iterate.c \
        tgsi/tgsi_parse.c \
        tgsi/tgsi_ppc.c \
+       tgsi/tgsi_sanity.c \
        tgsi/tgsi_scan.c \
        tgsi/tgsi_sse2.c \
        tgsi/tgsi_text.c \
        tgsi/tgsi_transform.c \
        tgsi/tgsi_ureg.c \
        tgsi/tgsi_util.c \
-       translate/translate_generic.c \
-       translate/translate_sse.c \
        translate/translate.c \
        translate/translate_cache.c \
+       translate/translate_generic.c \
+       translate/translate_sse.c \
        util/u_debug.c \
-       util/u_debug_symbol.c \
+       util/u_debug_describe.c \
+       util/u_debug_refcnt.c \
        util/u_debug_stack.c \
+       util/u_debug_symbol.c \
        util/u_dump_defines.c \
        util/u_dump_state.c \
        util/u_bitmask.c \
        util/u_blit.c \
        util/u_blitter.c \
        util/u_cache.c \
+       util/u_caps.c \
        util/u_cpu_detect.c \
        util/u_dl.c \
        util/u_draw_quad.c \
        util/u_format_tests.c \
        util/u_format_yuv.c \
        util/u_format_zs.c \
+       util/u_framebuffer.c \
        util/u_gen_mipmap.c \
        util/u_half.c \
        util/u_handle_table.c \
-       util/u_hash_table.c \
        util/u_hash.c \
+       util/u_hash_table.c \
+       util/u_index_modify.c \
        util/u_keymap.c \
        util/u_linear.c \
+       util/u_linkage.c \
        util/u_network.c \
        util/u_math.c \
+       util/u_mempool.c \
        util/u_mm.c \
        util/u_rect.c \
        util/u_ringbuffer.c \
        util/u_sampler.c \
        util/u_simple_shaders.c \
        util/u_snprintf.c \
+       util/u_staging.c \
        util/u_surface.c \
        util/u_surfaces.c \
        util/u_texture.c \
        util/u_transfer.c \
        util/u_resource.c \
        util/u_upload_mgr.c \
 -      target-helpers/wrap_screen.c
 -
 -      # Disabling until pipe-video branch gets merged in
 -      #vl/vl_bitstream_parser.c \
 -      #vl/vl_mpeg12_mc_renderer.c \
 -      #vl/vl_compositor.c \
 -      #vl/vl_csc.c \
 -      #vl/vl_shader_build.c \
 +      target-helpers/wrap_screen.c \
 +      vl/vl_bitstream_parser.c \
 +      vl/vl_mpeg12_mc_renderer.c \
 +      vl/vl_compositor.c \
 +      vl/vl_csc.c
  
  GALLIVM_SOURCES = \
          gallivm/lp_bld_arit.c \
+         gallivm/lp_bld_assert.c \
+         gallivm/lp_bld_bitarit.c \
          gallivm/lp_bld_const.c \
          gallivm/lp_bld_conv.c \
          gallivm/lp_bld_debug.c \
          gallivm/lp_bld_flow.c \
          gallivm/lp_bld_format_aos.c \
          gallivm/lp_bld_format_soa.c \
+         gallivm/lp_bld_format_yuv.c \
+         gallivm/lp_bld_gather.c \
          gallivm/lp_bld_init.c \
          gallivm/lp_bld_intr.c \
          gallivm/lp_bld_logic.c \
          gallivm/lp_bld_pack.c \
          gallivm/lp_bld_printf.c \
+         gallivm/lp_bld_quad.c \
          gallivm/lp_bld_sample.c \
+         gallivm/lp_bld_sample_aos.c \
          gallivm/lp_bld_sample_soa.c \
          gallivm/lp_bld_struct.c \
          gallivm/lp_bld_swizzle.c \
+         gallivm/lp_bld_tgsi_aos.c \
          gallivm/lp_bld_tgsi_soa.c \
          gallivm/lp_bld_type.c \
          draw/draw_llvm.c \
-         draw/draw_pt_fetch_shade_pipeline_llvm.c \
-         draw/draw_llvm_translate.c
+         draw/draw_llvm_sample.c \
+         draw/draw_llvm_translate.c \
+         draw/draw_vs_llvm.c \
+         draw/draw_pt_fetch_shade_pipeline_llvm.c
  
- GALLIVM_CPP_SOURCES =
+ GALLIVM_CPP_SOURCES = \
+     gallivm/lp_bld_misc.cpp
  
  GENERATED_SOURCES = \
        indices/u_indices_gen.c \
index 6cea83060a95a4810174019bc241bd18cf409737,48547c4b2c6fce65fda01f00e121fe9e5050afe0..a18f7c0b2a386a4febd9ef6247e13f660ea321a4
@@@ -32,28 -32,30 +32,30 @@@ env.CodeGenerate
  
  env.CodeGenerate(
      target = 'util/u_format_table.c',
-     script = 'util/u_format_table.py',
-     source = ['util/u_format.csv'],
-     command = 'python $SCRIPT $SOURCE > $TARGET'
+     script = '#src/gallium/auxiliary/util/u_format_table.py',
+     source = ['#src/gallium/auxiliary/util/u_format.csv'],
+     command = python_cmd + ' $SCRIPT $SOURCE > $TARGET'
  )
  
  env.CodeGenerate(
      target = 'util/u_half.c',
      script = 'util/u_half.py',
      source = [],
-     command = 'python $SCRIPT > $TARGET'
+     command = python_cmd + ' $SCRIPT > $TARGET'
  )
  
  env.Depends('util/u_format_table.c', [
-     'util/u_format_parse.py', 
+     '#src/gallium/auxiliary/util/u_format_parse.py',
      'util/u_format_pack.py', 
  ])
  
  source = [
-     'cso_cache/cso_context.c',
      'cso_cache/cso_cache.c',
+     'cso_cache/cso_context.c',
      'cso_cache/cso_hash.c',
      'draw/draw_context.c',
+     'draw/draw_fs.c',
+     'draw/draw_gs.c',
      'draw/draw_pipe.c',
      'draw/draw_pipe_aaline.c',
      'draw/draw_pipe_aapoint.c',
      'draw/draw_pipe_wide_line.c',
      'draw/draw_pipe_wide_point.c',
      'draw/draw_pt.c',
-     'draw/draw_pt_elts.c',
      'draw/draw_pt_emit.c',
      'draw/draw_pt_fetch.c',
      'draw/draw_pt_fetch_emit.c',
      'draw/draw_pt_fetch_shade_emit.c',
      'draw/draw_pt_fetch_shade_pipeline.c',
      'draw/draw_pt_post_vs.c',
+     'draw/draw_pt_so_emit.c',
      'draw/draw_pt_util.c',
-     'draw/draw_pt_varray.c',
-     'draw/draw_pt_vcache.c',
+     'draw/draw_pt_vsplit.c',
      'draw/draw_vertex.c',
      'draw/draw_vs.c',
      'draw/draw_vs_aos.c',
      'draw/draw_vs_ppc.c',
      'draw/draw_vs_sse.c',
      'draw/draw_vs_varient.c',
-     'draw/draw_gs.c',
      #'indices/u_indices.c',
      #'indices/u_unfilled_indices.c',
      'indices/u_indices_gen.c',
      'indices/u_unfilled_gen.c',
      'os/os_misc.c',
+     'os/os_stream.c',
      'os/os_stream_log.c',
+     'os/os_stream_null.c',
      'os/os_stream_stdc.c',
      'os/os_stream_str.c',
-     'os/os_stream_null.c',
      'os/os_time.c',
      'pipebuffer/pb_buffer_fenced.c',
      'pipebuffer/pb_buffer_malloc.c',
      'pipebuffer/pb_bufmgr_pool.c',
      'pipebuffer/pb_bufmgr_slab.c',
      'pipebuffer/pb_validate.c',
+     'rbug/rbug_connection.c',
+     'rbug/rbug_context.c',
      'rbug/rbug_core.c',
+     'rbug/rbug_demarshal.c',
      'rbug/rbug_shader.c',
-     'rbug/rbug_context.c',
      'rbug/rbug_texture.c',
-     'rbug/rbug_demarshal.c',
-     'rbug/rbug_connection.c',
      'rtasm/rtasm_cpu.c',
      'rtasm/rtasm_execmem.c',
-     'rtasm/rtasm_x86sse.c',
      'rtasm/rtasm_ppc.c',
      'rtasm/rtasm_ppc_spe.c',
+     'rtasm/rtasm_x86sse.c',
      'tgsi/tgsi_build.c',
      'tgsi/tgsi_dump.c',
      'tgsi/tgsi_exec.c',
      'tgsi/tgsi_info.c',
      'tgsi/tgsi_iterate.c',
      'tgsi/tgsi_parse.c',
+     'tgsi/tgsi_ppc.c',
      'tgsi/tgsi_sanity.c',
      'tgsi/tgsi_scan.c',
-     'tgsi/tgsi_ppc.c',
      'tgsi/tgsi_sse2.c',
      'tgsi/tgsi_text.c',
      'tgsi/tgsi_transform.c',
      'tgsi/tgsi_ureg.c',
      'tgsi/tgsi_util.c',
-     'translate/translate_generic.c',
-     'translate/translate_sse.c',
      'translate/translate.c',
      'translate/translate_cache.c',
+     'translate/translate_generic.c',
+     'translate/translate_sse.c',
      'util/u_bitmask.c',
      'util/u_blit.c',
      'util/u_blitter.c',
      'util/u_cache.c',
+     'util/u_caps.c',
      'util/u_cpu_detect.c',
      'util/u_debug.c',
+     'util/u_debug_describe.c',
      'util/u_debug_memory.c',
+     'util/u_debug_refcnt.c',
      'util/u_debug_stack.c',
      'util/u_debug_symbol.c',
      'util/u_dump_defines.c',
      'util/u_format_tests.c',
      'util/u_format_yuv.c',
      'util/u_format_zs.c',
+     'util/u_framebuffer.c',
      'util/u_gen_mipmap.c',
      'util/u_half.c',
      'util/u_handle_table.c',
      'util/u_hash.c',
      'util/u_hash_table.c',
+     'util/u_index_modify.c',
      'util/u_keymap.c',
+     'util/u_linear.c',
+     'util/u_linkage.c',
      'util/u_network.c',
      'util/u_math.c',
+     'util/u_mempool.c',
      'util/u_mm.c',
      'util/u_rect.c',
      'util/u_resource.c',
      'util/u_sampler.c',
      'util/u_simple_shaders.c',
      'util/u_snprintf.c',
+     'util/u_staging.c',
      'util/u_surface.c',
      'util/u_surfaces.c',
      'util/u_texture.c',
      'util/u_tile.c',
      'util/u_transfer.c',
      'util/u_upload_mgr.c',
 -    # Disabling until pipe-video branch gets merged in
 -    #'vl/vl_bitstream_parser.c',
 -    #'vl/vl_mpeg12_mc_renderer.c',
 -    #'vl/vl_compositor.c',
 -    #'vl/vl_csc.c',
 -    #'vl/vl_shader_build.c',
 +    'vl/vl_bitstream_parser.c',
 +    'vl/vl_mpeg12_mc_renderer.c',
 +    'vl/vl_compositor.c',
 +    'vl/vl_csc.c',
      'target-helpers/wrap_screen.c',
  ]
  
  if env['llvm']:
      source += [
      'gallivm/lp_bld_arit.c',
+     'gallivm/lp_bld_assert.c',
+     'gallivm/lp_bld_bitarit.c',
      'gallivm/lp_bld_const.c',
      'gallivm/lp_bld_conv.c',
      'gallivm/lp_bld_debug.c',
      'gallivm/lp_bld_flow.c',
      'gallivm/lp_bld_format_aos.c',
      'gallivm/lp_bld_format_soa.c',
+     'gallivm/lp_bld_format_yuv.c',
+     'gallivm/lp_bld_gather.c',
+     'gallivm/lp_bld_init.c',
      'gallivm/lp_bld_intr.c',
      'gallivm/lp_bld_logic.c',
-     'gallivm/lp_bld_init.c',
+     'gallivm/lp_bld_misc.cpp',
      'gallivm/lp_bld_pack.c',
      'gallivm/lp_bld_printf.c',
+     'gallivm/lp_bld_quad.c',
      'gallivm/lp_bld_sample.c',
+     'gallivm/lp_bld_sample_aos.c',
      'gallivm/lp_bld_sample_soa.c',
      'gallivm/lp_bld_struct.c',
      'gallivm/lp_bld_swizzle.c',
+     'gallivm/lp_bld_tgsi_aos.c',
      'gallivm/lp_bld_tgsi_soa.c',
      'gallivm/lp_bld_type.c',
      'draw/draw_llvm.c',
+     'draw/draw_llvm_sample.c',
+     'draw/draw_llvm_translate.c',
      'draw/draw_pt_fetch_shade_pipeline_llvm.c',
-     'draw/draw_llvm_translate.c'
+     'draw/draw_vs_llvm.c'
      ]
  
  gallium = env.ConvenienceLibrary(
index e7ca6e6cb57de9cdd6c3e9a8a4f2c57518dcb800,46bb082388116d98c17ee3b8e0086f4753511e4e..95da778225616b0fce542d8839f6be890c39c433
@@@ -4,7 -4,7 +4,7 @@@ include $(TOP)/configs/curren
  LIBNAME = nvfx
  
  C_SOURCES = \
-       nv04_surface_2d.c \
+       nv04_2d.c \
        nvfx_buffer.c \
        nvfx_context.c \
        nvfx_clear.c \
        nv30_fragtex.c \
        nv40_fragtex.c \
        nvfx_miptree.c \
+       nvfx_push.c \
        nvfx_query.c \
        nvfx_resource.c \
        nvfx_screen.c \
        nvfx_state.c \
-       nvfx_state_blend.c \
        nvfx_state_emit.c \
        nvfx_state_fb.c \
-       nvfx_state_rasterizer.c \
-       nvfx_state_scissor.c \
-       nvfx_state_stipple.c \
-       nvfx_state_viewport.c \
-       nvfx_state_zsa.c \
        nvfx_surface.c \
        nvfx_transfer.c \
        nvfx_vbo.c \
 -      nvfx_vertprog.c
 +      nvfx_vertprog.c \
 +      nvfx_video_context.c
  
  LIBRARY_INCLUDES = \
        -I$(TOP)/src/gallium/drivers/nouveau/include
index a4d5c61b7aa3c82e34fa4c76c55bcf380f7da08a,8024800bd09dc29d8ca464856d7e323e8876aeeb..875b3a96ca693847db87a1ca8cbb51beec3256f7
@@@ -1,59 -1,51 +1,52 @@@
  #include "pipe/p_screen.h"
  #include "pipe/p_state.h"
+ #include "util/u_format_s3tc.h"
  #include "util/u_simple_screen.h"
  
  #include "nouveau/nouveau_screen.h"
+ #include "nouveau/nv_object.xml.h"
  #include "nvfx_context.h"
 +#include "nvfx_video_context.h"
  #include "nvfx_screen.h"
  #include "nvfx_resource.h"
+ #include "nvfx_tex.h"
  
- #define NV30TCL_CHIPSET_3X_MASK 0x00000003
- #define NV34TCL_CHIPSET_3X_MASK 0x00000010
- #define NV35TCL_CHIPSET_3X_MASK 0x000001e0
- /* FIXME: It seems I should not include directly ../../winsys/drm/nouveau/drm/nouveau_drm_api.h
- * to get the pointer to the context front buffer, so I copied nouveau_winsys here.
- * nv30_screen_surface_format_supported() can then use it to enforce creating fbo
- * with same number of bits everywhere.
- */
- struct nouveau_winsys {
-       struct pipe_winsys base;
+ #define NV30_3D_CHIPSET_3X_MASK 0x00000003
+ #define NV34_3D_CHIPSET_3X_MASK 0x00000010
+ #define NV35_3D_CHIPSET_3X_MASK 0x000001e0
  
-       struct pipe_screen *pscreen;
-       struct pipe_surface *front;
- };
  #define NV4X_GRCLASS4097_CHIPSETS 0x00000baf
  #define NV4X_GRCLASS4497_CHIPSETS 0x00005450
  #define NV6X_GRCLASS4497_CHIPSETS 0x00000088
  
  static int
- nvfx_screen_get_param(struct pipe_screen *pscreen, int param)
+ nvfx_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
  {
        struct nvfx_screen *screen = nvfx_screen(pscreen);
  
        switch (param) {
        case PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS:
-               /* TODO: check this */
-               return screen->is_nv4x ? 16 : 8;
+               return 16;
        case PIPE_CAP_NPOT_TEXTURES:
-               return !!screen->is_nv4x;
+               return screen->advertise_npot;
        case PIPE_CAP_TWO_SIDED_STENCIL:
                return 1;
        case PIPE_CAP_GLSL:
-               return 0;
+               return 1;
        case PIPE_CAP_ANISOTROPIC_FILTER:
                return 1;
        case PIPE_CAP_POINT_SPRITE:
                return 1;
        case PIPE_CAP_MAX_RENDER_TARGETS:
-               return screen->is_nv4x ? 4 : 2;
+               return screen->use_nv4x ? 4 : 2;
        case PIPE_CAP_OCCLUSION_QUERY:
                return 1;
+         case PIPE_CAP_TIMER_QUERY:
+               return 0;
        case PIPE_CAP_TEXTURE_SHADOW_MAP:
                return 1;
+       case PIPE_CAP_TEXTURE_SWIZZLE:
+               return 1;
        case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
                return 13;
        case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
        case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
                return 13;
        case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
-               return !!screen->is_nv4x;
+               return !!screen->use_nv4x;
        case PIPE_CAP_TEXTURE_MIRROR_REPEAT:
                return 1;
        case PIPE_CAP_MAX_VERTEX_TEXTURE_UNITS:
                return 0; /* We have 4 on nv40 - but unsupported currently */
-       case PIPE_CAP_TGSI_CONT_SUPPORTED:
-               return 0;
        case PIPE_CAP_BLEND_EQUATION_SEPARATE:
-               return !!screen->is_nv4x;
+               return screen->advertise_blend_equation_separate;
        case PIPE_CAP_MAX_COMBINED_SAMPLERS:
                return 16;
        case PIPE_CAP_INDEP_BLEND_ENABLE:
                return 0;
        case PIPE_CAP_INDEP_BLEND_FUNC:
                return 0;
+       case PIPE_CAP_DEPTHSTENCIL_CLEAR_SEPARATE:
+               return 0;
        case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
        case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
-               return 1;
        case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
        case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
-               return 0;
+               return 1;
+       case PIPE_CAP_DEPTH_CLAMP:
+               return 0; // TODO: implement depth clamp
        default:
-               NOUVEAU_ERR("Unknown PIPE_CAP %d\n", param);
+               NOUVEAU_ERR("Warning: unknown PIPE_CAP %d\n", param);
                return 0;
        }
  }
  
+ static int
+ nvfx_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader, enum pipe_shader_cap param)
+ {
+       struct nvfx_screen *screen = nvfx_screen(pscreen);
+       switch(shader) {
+       case PIPE_SHADER_FRAGMENT:
+               switch(param) {
+               case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
+               case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
+               case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
+               case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
+                       return 4096;
+               case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
+                       /* FIXME: is it the dynamic (nv30:0/nv40:24) or the static
+                        value (nv30:0/nv40:4) ? */
+                       return screen->use_nv4x ? 4 : 0;
+               case PIPE_SHADER_CAP_MAX_INPUTS:
+                       return screen->use_nv4x ? 12 : 10;
+               case PIPE_SHADER_CAP_MAX_CONSTS:
+                       return screen->use_nv4x ? 224 : 32;
+               case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
+                   return 1;
+               case PIPE_SHADER_CAP_MAX_TEMPS:
+                       return 32;
+               case PIPE_SHADER_CAP_MAX_ADDRS:
+                       return screen->use_nv4x ? 1 : 0;
+               case PIPE_SHADER_CAP_MAX_PREDS:
+                       return 0; /* we could expose these, but nothing uses them */
+               case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
+                   return 0;
+               default:
+                       break;
+               }
+               break;
+       case PIPE_SHADER_VERTEX:
+               switch(param) {
+               case PIPE_SHADER_CAP_MAX_INSTRUCTIONS:
+               case PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS:
+                       return screen->use_nv4x ? 512 : 256;
+               case PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS:
+               case PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS:
+                       return screen->use_nv4x ? 512 : 0;
+               case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
+                       /* FIXME: is it the dynamic (nv30:24/nv40:24) or the static
+                        value (nv30:1/nv40:4) ? */
+                       return screen->use_nv4x ? 4 : 1;
+               case PIPE_SHADER_CAP_MAX_INPUTS:
+                       return 16;
+               case PIPE_SHADER_CAP_MAX_CONSTS:
+                       /* - 6 is for clip planes; Gallium should be fixed to put
+                        * them in the vertex shader itself, so we don't need to reserve these */
+                       return (screen->use_nv4x ? 468 : 256) - 6;
+                    case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
+                           return 1;
+               case PIPE_SHADER_CAP_MAX_TEMPS:
+                       return screen->use_nv4x ? 32 : 13;
+               case PIPE_SHADER_CAP_MAX_ADDRS:
+                       return 2;
+               case PIPE_SHADER_CAP_MAX_PREDS:
+                       return 0; /* we could expose these, but nothing uses them */
+               case PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED:
+                         return 1;
+               default:
+                       break;
+               }
+               break;
+       default:
+               break;
+       }
+       return 0;
+ }
  static float
- nvfx_screen_get_paramf(struct pipe_screen *pscreen, int param)
+ nvfx_screen_get_paramf(struct pipe_screen *pscreen, enum pipe_cap param)
  {
        struct nvfx_screen *screen = nvfx_screen(pscreen);
  
        case PIPE_CAP_MAX_POINT_WIDTH_AA:
                return 64.0;
        case PIPE_CAP_MAX_TEXTURE_ANISOTROPY:
-               return screen->is_nv4x ? 16.0 : 8.0;
+               return screen->use_nv4x ? 16.0 : 8.0;
        case PIPE_CAP_MAX_TEXTURE_LOD_BIAS:
-               return screen->is_nv4x ? 16.0 : 4.0;
+               return 15.0;
        default:
                NOUVEAU_ERR("Unknown PIPE_CAP %d\n", param);
                return 0.0;
  }
  
  static boolean
- nvfx_screen_surface_format_supported(struct pipe_screen *pscreen,
+ nvfx_screen_is_format_supported(struct pipe_screen *pscreen,
                                     enum pipe_format format,
                                     enum pipe_texture_target target,
-                                    unsigned tex_usage, unsigned geom_flags)
+                                    unsigned sample_count,
+                                    unsigned bind, unsigned geom_flags)
  {
        struct nvfx_screen *screen = nvfx_screen(pscreen);
-       struct pipe_surface *front = ((struct nouveau_winsys *) pscreen->winsys)->front;
  
-       if (tex_usage & PIPE_BIND_RENDER_TARGET) {
+        if (sample_count > 1)
+               return FALSE;
+       if (bind & PIPE_BIND_RENDER_TARGET) {
                switch (format) {
                case PIPE_FORMAT_B8G8R8A8_UNORM:
                case PIPE_FORMAT_B8G8R8X8_UNORM:
+               case PIPE_FORMAT_R8G8B8A8_UNORM:
+               case PIPE_FORMAT_R8G8B8X8_UNORM:
                case PIPE_FORMAT_B5G6R5_UNORM:
-                       return TRUE;
-               default:
                        break;
+               case PIPE_FORMAT_R16G16B16A16_FLOAT:
+                       if(!screen->advertise_fp16)
+                               return FALSE;
+                       break;
+               case PIPE_FORMAT_R32G32B32A32_FLOAT:
+                       if(!screen->advertise_fp32)
+                               return FALSE;
+                       break;
+               default:
+                       return FALSE;
                }
-       } else
-       if (tex_usage & PIPE_BIND_DEPTH_STENCIL) {
+       }
+       if (bind & PIPE_BIND_DEPTH_STENCIL) {
                switch (format) {
                case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
                case PIPE_FORMAT_X8Z24_UNORM:
-                       return TRUE;
                case PIPE_FORMAT_Z16_UNORM:
-                       /* TODO: this nv30 limitation probably does not exist */
-                       if (!screen->is_nv4x && front)
-                               return (front->format == PIPE_FORMAT_B5G6R5_UNORM);
-                       return TRUE;
-               default:
                        break;
-               }
-       } else {
-               switch (format) {
-               case PIPE_FORMAT_B8G8R8A8_UNORM:
-               case PIPE_FORMAT_B8G8R8X8_UNORM:
-               case PIPE_FORMAT_B5G5R5A1_UNORM:
-               case PIPE_FORMAT_B4G4R4A4_UNORM:
-               case PIPE_FORMAT_B5G6R5_UNORM:
-               case PIPE_FORMAT_L8_UNORM:
-               case PIPE_FORMAT_A8_UNORM:
-               case PIPE_FORMAT_I8_UNORM:
-               case PIPE_FORMAT_L8A8_UNORM:
-               case PIPE_FORMAT_Z16_UNORM:
-               case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
-               case PIPE_FORMAT_DXT1_RGB:
-               case PIPE_FORMAT_DXT1_RGBA:
-               case PIPE_FORMAT_DXT3_RGBA:
-               case PIPE_FORMAT_DXT5_RGBA:
-                       return TRUE;
-               /* TODO: does nv30 support this? */
-               case PIPE_FORMAT_R16_SNORM:
-                       return !!screen->is_nv4x;
                default:
-                       break;
+                       return FALSE;
                }
        }
  
-       return FALSE;
- }
+       if (bind & PIPE_BIND_SAMPLER_VIEW) {
+               struct nvfx_texture_format* tf = &nvfx_texture_formats[format];
+               if(util_format_is_s3tc(format) && !util_format_s3tc_enabled)
+                       return FALSE;
+               if(format == PIPE_FORMAT_R16G16B16A16_FLOAT && !screen->advertise_fp16)
+                       return FALSE;
+               if(format == PIPE_FORMAT_R32G32B32A32_FLOAT && !screen->advertise_fp32)
+                       return FALSE;
+               if(screen->use_nv4x)
+               {
+                       if(tf->fmt[4] < 0)
+                               return FALSE;
+               }
+               else
+               {
+                       if(tf->fmt[0] < 0)
+                               return FALSE;
+               }
+       }
+       // note that we do actually support everything through translate
+       if (bind & PIPE_BIND_VERTEX_BUFFER) {
+               unsigned type = nvfx_vertex_formats[format];
+               if(!type)
+                       return FALSE;
+       }
+       if (bind & PIPE_BIND_INDEX_BUFFER) {
+               // 8-bit indices supported, but not in hardware index buffer
+               if(format != PIPE_FORMAT_R16_USCALED && format != PIPE_FORMAT_R32_USCALED)
+                       return FALSE;
+       }
  
+       if(bind & PIPE_BIND_STREAM_OUTPUT)
+               return FALSE;
+       return TRUE;
+ }
  
  static void
  nvfx_screen_destroy(struct pipe_screen *pscreen)
        nouveau_notifier_free(&screen->query);
        nouveau_notifier_free(&screen->sync);
        nouveau_grobj_free(&screen->eng3d);
-       nv04_surface_2d_takedown(&screen->eng2d);
+       nvfx_screen_surface_takedown(pscreen);
  
        nouveau_screen_fini(&screen->base);
  
@@@ -199,9 -286,9 +287,9 @@@ static void nv30_screen_init(struct nvf
  
        /* TODO: perhaps we should do some of this on nv40 too? */
        for (i=1; i<8; i++) {
-               OUT_RING(chan, RING_3D(NV34TCL_VIEWPORT_CLIP_HORIZ(i), 1));
+               OUT_RING(chan, RING_3D(NV30_3D_VIEWPORT_CLIP_HORIZ(i), 1));
                OUT_RING(chan, 0);
-               OUT_RING(chan, RING_3D(NV34TCL_VIEWPORT_CLIP_VERT(i), 1));
+               OUT_RING(chan, RING_3D(NV30_3D_VIEWPORT_CLIP_VERT(i), 1));
                OUT_RING(chan, 0);
        }
  
        OUT_RING(chan, RING_3D(0x1d88, 1));
        OUT_RING(chan, 0x00001200);
  
-       OUT_RING(chan, RING_3D(NV34TCL_RC_ENABLE, 1));
+       OUT_RING(chan, RING_3D(NV30_3D_RC_ENABLE, 1));
        OUT_RING(chan, 0);
  
-       OUT_RING(chan, RING_3D(NV34TCL_DEPTH_RANGE_NEAR, 2));
+       OUT_RING(chan, RING_3D(NV30_3D_DEPTH_RANGE_NEAR, 2));
        OUT_RING(chan, fui(0.0));
        OUT_RING(chan, fui(1.0));
  
-       OUT_RING(chan, RING_3D(NV34TCL_MULTISAMPLE_CONTROL, 1));
+       OUT_RING(chan, RING_3D(NV30_3D_MULTISAMPLE_CONTROL, 1));
        OUT_RING(chan, 0xffff0000);
  
        /* enables use of vp rather than fixed-function somehow */
@@@ -256,10 -343,13 +344,13 @@@ static void nv40_screen_init(struct nvf
  {
        struct nouveau_channel *chan = screen->base.channel;
  
-       OUT_RING(chan, RING_3D(NV40TCL_DMA_COLOR2, 2));
+       OUT_RING(chan, RING_3D(NV40_3D_DMA_COLOR2, 2));
        OUT_RING(chan, screen->base.channel->vram->handle);
        OUT_RING(chan, screen->base.channel->vram->handle);
  
+       OUT_RING(chan, RING_3D(0x1450, 1));
+       OUT_RING(chan, 0x00000004);
        OUT_RING(chan, RING_3D(0x1ea4, 3));
        OUT_RING(chan, 0x00000010);
        OUT_RING(chan, 0x01000100);
        OUT_RING(chan, 0x06144321);
        OUT_RING(chan, RING_3D(0x1fc8, 2));
        OUT_RING(chan, 0xedcba987);
-       OUT_RING(chan, 0x00000021);
+       OUT_RING(chan, 0x0000006f);
        OUT_RING(chan, RING_3D(0x1fd0, 1));
        OUT_RING(chan, 0x00171615);
        OUT_RING(chan, RING_3D(0x1fd4, 1));
        OUT_RING(chan, RING_3D(0x1ef8, 1));
        OUT_RING(chan, 0x0020ffff);
        OUT_RING(chan, RING_3D(0x1d64, 1));
-       OUT_RING(chan, 0x00d30000);
+       OUT_RING(chan, 0x01d300d4);
        OUT_RING(chan, RING_3D(0x1e94, 1));
        OUT_RING(chan, 0x00000001);
+       OUT_RING(chan, RING_3D(NV40_3D_MIPMAP_ROUNDING, 1));
+       OUT_RING(chan, NV40_3D_MIPMAP_ROUNDING_MODE_DOWN);
  }
  
  static unsigned
@@@ -298,22 -391,17 +392,17 @@@ nvfx_screen_get_vertex_buffer_flags(str
                vram_hack_default = 1;
        vram_hack = debug_get_bool_option("NOUVEAU_VTXIDX_IN_VRAM", vram_hack_default);
  
- #ifdef DEBUG
-       if(!vram_hack)
-       {
-               fprintf(stderr, "Some systems may experience graphics corruption due to randomly misplaced vertices.\n"
-                       "If this is happening, export NOUVEAU_VTXIDX_IN_VRAM=1 may reduce or eliminate the problem\n");
-       }
-       else
-       {
-               fprintf(stderr, "A performance reducing hack is being used to help avoid graphics corruption.\n"
-                       "You can try export NOUVEAU_VTXIDX_IN_VRAM=0 to disable it.\n");
-       }
- #endif
        return vram_hack ? NOUVEAU_BO_VRAM : NOUVEAU_BO_GART;
  }
  
+ static void nvfx_channel_flush_notify(struct nouveau_channel* chan)
+ {
+       struct nvfx_screen* screen = chan->user_private;
+       struct nvfx_context* nvfx = screen->cur_ctx;
+       if(nvfx)
+               nvfx->relocs_needed = NVFX_RELOCATE_ALL;
+ }
  struct pipe_screen *
  nvfx_screen_create(struct pipe_winsys *ws, struct nouveau_device *dev)
  {
                return NULL;
        }
        chan = screen->base.channel;
+       screen->cur_ctx = NULL;
+       chan->user_private = screen;
+       chan->flush_notify = nvfx_channel_flush_notify;
  
        pscreen->winsys = ws;
        pscreen->destroy = nvfx_screen_destroy;
        pscreen->get_param = nvfx_screen_get_param;
+       pscreen->get_shader_param = nvfx_screen_get_shader_param;
        pscreen->get_paramf = nvfx_screen_get_paramf;
-       pscreen->is_format_supported = nvfx_screen_surface_format_supported;
+       pscreen->is_format_supported = nvfx_screen_is_format_supported;
        pscreen->context_create = nvfx_create;
 +      pscreen->video_context_create = nvfx_video_create;
  
        switch (dev->chipset & 0xf0) {
        case 0x30:
-               if (NV30TCL_CHIPSET_3X_MASK & (1 << (dev->chipset & 0x0f)))
-                       eng3d_class = 0x0397;
-               else if (NV34TCL_CHIPSET_3X_MASK & (1 << (dev->chipset & 0x0f)))
-                       eng3d_class = 0x0697;
-               else if (NV35TCL_CHIPSET_3X_MASK & (1 << (dev->chipset & 0x0f)))
-                       eng3d_class = 0x0497;
+               if (NV30_3D_CHIPSET_3X_MASK & (1 << (dev->chipset & 0x0f)))
+                       eng3d_class = NV30_3D;
+               else if (NV34_3D_CHIPSET_3X_MASK & (1 << (dev->chipset & 0x0f)))
+                       eng3d_class = NV34_3D;
+               else if (NV35_3D_CHIPSET_3X_MASK & (1 << (dev->chipset & 0x0f)))
+                       eng3d_class = NV35_3D;
                break;
        case 0x40:
                if (NV4X_GRCLASS4097_CHIPSETS & (1 << (dev->chipset & 0x0f)))
-                       eng3d_class = NV40TCL;
+                       eng3d_class = NV40_3D;
                else if (NV4X_GRCLASS4497_CHIPSETS & (1 << (dev->chipset & 0x0f)))
-                       eng3d_class = NV44TCL;
+                       eng3d_class = NV44_3D;
                screen->is_nv4x = ~0;
                break;
        case 0x60:
                if (NV6X_GRCLASS4497_CHIPSETS & (1 << (dev->chipset & 0x0f)))
-                       eng3d_class = NV44TCL;
+                       eng3d_class = NV44_3D;
                screen->is_nv4x = ~0;
                break;
        }
                return NULL;
        }
  
-       screen->force_swtnl = debug_get_bool_option("NOUVEAU_SWTNL", FALSE);
+       screen->advertise_npot = !!screen->is_nv4x;
+       screen->advertise_blend_equation_separate = !!screen->is_nv4x;
+       screen->use_nv4x = screen->is_nv4x;
+       if(screen->is_nv4x) {
+               if(debug_get_bool_option("NVFX_SIMULATE_NV30", FALSE))
+                       screen->use_nv4x = 0;
+               if(!debug_get_bool_option("NVFX_NPOT", TRUE))
+                       screen->advertise_npot = 0;
+               if(!debug_get_bool_option("NVFX_BLEND_EQ_SEP", TRUE))
+                       screen->advertise_blend_equation_separate = 0;
+       }
+       screen->force_swtnl = debug_get_bool_option("NVFX_SWTNL", FALSE);
+       screen->trace_draw = debug_get_bool_option("NVFX_TRACE_DRAW", FALSE);
+       screen->buffer_allocation_cost = debug_get_num_option("NVFX_BUFFER_ALLOCATION_COST", 16384);
+       screen->inline_cost_per_hardware_cost = atof(debug_get_option("NVFX_INLINE_COST_PER_HARDWARE_COST", "1.0"));
+       screen->static_reuse_threshold = atof(debug_get_option("NVFX_STATIC_REUSE_THRESHOLD", "2.0"));
+       /* We don't advertise these by default because filtering and blending doesn't work as
+        * it should, due to several restrictions.
+        * The only exception is fp16 on nv40.
+        */
+       screen->advertise_fp16 = debug_get_bool_option("NVFX_FP16", !!screen->use_nv4x);
+       screen->advertise_fp32 = debug_get_bool_option("NVFX_FP32", 0);
  
        screen->vertex_buffer_reloc_flags = nvfx_screen_get_vertex_buffer_flags(screen);
  
        /* surely both nv3x and nv44 support index buffers too: find out how and test that */
-       if(eng3d_class == NV40TCL)
+       if(eng3d_class == NV40_3D)
                screen->index_buffer_reloc_flags = screen->vertex_buffer_reloc_flags;
  
        if(!screen->force_swtnl && screen->vertex_buffer_reloc_flags == screen->index_buffer_reloc_flags)
        }
  
        /* 2D engine setup */
-       screen->eng2d = nv04_surface_2d_init(&screen->base);
-       screen->eng2d->buf = nvfx_surface_buffer;
+       nvfx_screen_surface_init(pscreen);
  
        /* Notifier for sync purposes */
        ret = nouveau_notifier_alloc(chan, 0xbeef0301, 1, &screen->sync);
        LIST_INITHEAD(&screen->query_list);
  
        /* Vtxprog resources */
-       if (nouveau_resource_init(&screen->vp_exec_heap, 0, screen->is_nv4x ? 512 : 256) ||
-           nouveau_resource_init(&screen->vp_data_heap, 0, 256)) {
+       if (nouveau_resource_init(&screen->vp_exec_heap, 0, screen->use_nv4x ? 512 : 256) ||
+           nouveau_resource_init(&screen->vp_data_heap, 0, screen->use_nv4x ? 468 : 256)) {
                nvfx_screen_destroy(pscreen);
                return NULL;
        }
  
        /* Static eng3d initialisation */
        /* note that we just started using the channel, so we must have space in the pushbuffer */
-       OUT_RING(chan, RING_3D(NV34TCL_DMA_NOTIFY, 1));
+       OUT_RING(chan, RING_3D(NV30_3D_DMA_NOTIFY, 1));
        OUT_RING(chan, screen->sync->handle);
-       OUT_RING(chan, RING_3D(NV34TCL_DMA_TEXTURE0, 2));
+       OUT_RING(chan, RING_3D(NV30_3D_DMA_TEXTURE0, 2));
        OUT_RING(chan, chan->vram->handle);
        OUT_RING(chan, chan->gart->handle);
-       OUT_RING(chan, RING_3D(NV34TCL_DMA_COLOR1, 1));
+       OUT_RING(chan, RING_3D(NV30_3D_DMA_COLOR1, 1));
        OUT_RING(chan, chan->vram->handle);
-       OUT_RING(chan, RING_3D(NV34TCL_DMA_COLOR0, 2));
+       OUT_RING(chan, RING_3D(NV30_3D_DMA_COLOR0, 2));
        OUT_RING(chan, chan->vram->handle);
        OUT_RING(chan, chan->vram->handle);
-       OUT_RING(chan, RING_3D(NV34TCL_DMA_VTXBUF0, 2));
+       OUT_RING(chan, RING_3D(NV30_3D_DMA_VTXBUF0, 2));
        OUT_RING(chan, chan->vram->handle);
        OUT_RING(chan, chan->gart->handle);
  
-       OUT_RING(chan, RING_3D(NV34TCL_DMA_FENCE, 2));
+       OUT_RING(chan, RING_3D(NV30_3D_DMA_FENCE, 2));
        OUT_RING(chan, 0);
        OUT_RING(chan, screen->query->handle);
  
-       OUT_RING(chan, RING_3D(NV34TCL_DMA_IN_MEMORY7, 2));
+       OUT_RING(chan, RING_3D(NV30_3D_DMA_UNK1AC, 2));
        OUT_RING(chan, chan->vram->handle);
        OUT_RING(chan, chan->vram->handle);
  
index 676d4fd34bbcb62dbf452736ae936f9825f30ab1,8fafca1950ccb5bc4116373dd881ef18899b7a87..15e1cbb1986703cf6202f5ca6ef76fe47b14191a
@@@ -2,14 -2,13 +2,14 @@@
  #define __NVFX_STATE_H__
  
  #include "pipe/p_state.h"
 +#include "pipe/p_video_state.h"
  #include "tgsi/tgsi_scan.h"
  #include "nouveau/nouveau_statebuf.h"
+ #include "util/u_dynarray.h"
+ #include "util/u_linkage.h"
  
  struct nvfx_vertex_program_exec {
        uint32_t data[4];
-       boolean has_branch_offset;
-       int const_index;
  };
  
  struct nvfx_vertex_program_data {
  };
  
  struct nvfx_vertex_program {
-       struct pipe_shader_state pipe;
-       struct draw_vertex_shader *draw;
-       boolean translated;
-       struct pipe_clip_state ucp;
+       unsigned long long id;
  
        struct nvfx_vertex_program_exec *insns;
        unsigned nr_insns;
        struct nvfx_vertex_program_data *consts;
        unsigned nr_consts;
  
+       char generic_to_fp_input[256];
+       int sprite_fp_input;
        struct nouveau_resource *exec;
        unsigned exec_start;
        struct nouveau_resource *data;
  
        uint32_t ir;
        uint32_t or;
-       uint32_t clip_ctrl;
+       int clip_nr;
+       struct util_dynarray branch_relocs;
+       struct util_dynarray const_relocs;
+ };
+ #define NVFX_VP_FAILED ((struct nvfx_vertex_program*)-1)
+ struct nvfx_pipe_vertex_program {
+       struct pipe_shader_state pipe;
+       struct tgsi_shader_info info;
+       unsigned draw_elements;
+       boolean draw_no_elements;
+       struct draw_vertex_shader *draw_vs;
+       struct nvfx_vertex_program* draw_vp;
+       struct nvfx_vertex_program* vp;
  };
  
  struct nvfx_fragment_program_data {
  struct nvfx_fragment_program_bo {
        struct nvfx_fragment_program_bo* next;
        struct nouveau_bo* bo;
+       unsigned char* slots;
        char insn[] __attribute__((aligned(16)));
  };
  
  struct nvfx_fragment_program {
-       struct pipe_shader_state pipe;
-       struct tgsi_shader_info info;
-       boolean translated;
        unsigned samplers;
+       unsigned point_sprite_control;
+       unsigned or;
+       unsigned coord_conventions;
  
        uint32_t *insn;
        int       insn_len;
        struct nvfx_fragment_program_data *consts;
        unsigned nr_consts;
  
+       /* the slot at num_slots is for the sprite coordinate, if any */
+       unsigned num_slots; /* how many input semantics? */
+       unsigned char slot_to_generic[10]; /* semantics */
+       unsigned char slot_to_fp_input[11]; /* current assignment of slots for each used semantic */
+       struct util_dynarray slot_relocations[11];
+       /* This is reset to progs on any relocation update, and decreases every time we
+        * move to a new prog due to a constant update
+        * When this is the same as progs, applying relocations is no longer necessary.
+        */
+       unsigned progs_left_with_obsolete_slot_assignments;
+       unsigned long long last_vp_id;
+       unsigned last_sprite_coord_enable;
        uint32_t fp_control;
  
        unsigned bo_prog_idx;
        unsigned prog_size;
        unsigned progs_per_bo;
+       unsigned progs;
        struct nvfx_fragment_program_bo* fpbo;
  };
  
+ struct nvfx_pipe_fragment_program {
+         struct pipe_shader_state pipe;
+         struct tgsi_shader_info info;
+         struct nvfx_fragment_program* fps[2];
+ };
  
  #endif
index 3111c49a2c2df22d9f15dab813f18dfc5c0caf06,28953582f0a4bf36dfd72b3e1df64ce0daded59a..8876bd163986febd5106778725061da337207d0f
@@@ -19,12 -19,13 +19,13 @@@ C_SOURCES = 
        sp_quad_fs.c \
        sp_quad_blend.c \
        sp_screen.c \
 -        sp_setup.c \
 +      sp_setup.c \
        sp_state_blend.c \
        sp_state_clip.c \
        sp_state_derived.c \
-       sp_state_fs.c \
        sp_state_sampler.c \
+       sp_state_shader.c \
+       sp_state_so.c \
        sp_state_rasterizer.c \
        sp_state_surface.c \
        sp_state_vertex.c \
@@@ -32,7 -33,6 +33,7 @@@
        sp_tex_sample.c \
        sp_tex_tile_cache.c \
        sp_tile_cache.c \
 -      sp_surface.c
 +      sp_surface.c \
 +      sp_video_context.c
  
  include ../../Makefile.template
index c51f449c63862c7c0bc6b2861f4c5b5cf83aac34,d5f4d28aeffe499928981c4d19d5b28413ca17b7..dea7f885e0def451cbab52bfe416559df94660e1
@@@ -24,9 -24,10 +24,10 @@@ softpipe = env.ConvenienceLibrary
                'sp_state_blend.c',
                'sp_state_clip.c',
                'sp_state_derived.c',
-               'sp_state_fs.c',
                'sp_state_rasterizer.c',
                'sp_state_sampler.c',
+               'sp_state_shader.c',
+               'sp_state_so.c',
                'sp_state_surface.c',
                'sp_state_vertex.c',
                'sp_surface.c',
@@@ -34,7 -35,6 +35,7 @@@
                'sp_tex_tile_cache.c',
                'sp_texture.c',
                'sp_tile_cache.c',
 +              'sp_video_context.c',
        ])
  
  Export('softpipe')
index 00700974c78da1cd0f79b0f934e28411f3a8cccb,2053d02f6289fcb4d726e975c71abe9342b658c2..25a0a6221798c762a6be5c25da7c75839bb219a6
  #include "util/u_format_s3tc.h"
  #include "pipe/p_defines.h"
  #include "pipe/p_screen.h"
+ #include "draw/draw_context.h"
  
  #include "state_tracker/sw_winsys.h"
+ #include "tgsi/tgsi_exec.h"
  
  #include "sp_texture.h"
  #include "sp_screen.h"
  #include "sp_context.h"
 +#include "sp_video_context.h"
  #include "sp_fence.h"
  #include "sp_public.h"
  
@@@ -57,7 -58,7 +59,7 @@@ softpipe_get_name(struct pipe_screen *s
  
  
  static int
- softpipe_get_param(struct pipe_screen *screen, int param)
+ softpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
  {
     switch (param) {
     case PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS:
@@@ -72,6 -73,8 +74,8 @@@
        return 1;
     case PIPE_CAP_GLSL:
        return 1;
+    case PIPE_CAP_SM3:
+       return 1;
     case PIPE_CAP_ANISOTROPIC_FILTER:
        return 0;
     case PIPE_CAP_POINT_SPRITE:
        return PIPE_MAX_COLOR_BUFS;
     case PIPE_CAP_OCCLUSION_QUERY:
        return 1;
+    case PIPE_CAP_TIMER_QUERY:
+       return 1;
     case PIPE_CAP_TEXTURE_MIRROR_CLAMP:
        return 1;
     case PIPE_CAP_TEXTURE_MIRROR_REPEAT:
        return 1;
     case PIPE_CAP_TEXTURE_SHADOW_MAP:
        return 1;
+    case PIPE_CAP_TEXTURE_SWIZZLE:
+       return 1;
     case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
        return SP_MAX_TEXTURE_2D_LEVELS;
     case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
        return SP_MAX_TEXTURE_3D_LEVELS;
     case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
        return SP_MAX_TEXTURE_2D_LEVELS;
-    case PIPE_CAP_TGSI_CONT_SUPPORTED:
-       return 1;
     case PIPE_CAP_BLEND_EQUATION_SEPARATE:
        return 1;
-    case PIPE_CAP_MAX_CONST_BUFFERS:
-       return PIPE_MAX_CONSTANT_BUFFERS;
-    case PIPE_CAP_MAX_CONST_BUFFER_SIZE:
-       return 4096 * 4 * sizeof(float);
     case PIPE_CAP_INDEP_BLEND_ENABLE:
        return 1;
     case PIPE_CAP_INDEP_BLEND_FUNC:
     case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
     case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
        return 1;
+    case PIPE_CAP_STREAM_OUTPUT:
+       return 1;
+    case PIPE_CAP_DEPTHSTENCIL_CLEAR_SEPARATE:
+       return 0;
     default:
        return 0;
     }
  }
  
+ static int
+ softpipe_get_shader_param(struct pipe_screen *screen, unsigned shader, enum pipe_shader_cap param)
+ {
+    switch(shader)
+    {
+    case PIPE_SHADER_FRAGMENT:
+       return tgsi_exec_get_shader_param(param);
+    case PIPE_SHADER_VERTEX:
+    case PIPE_SHADER_GEOMETRY:
+       return draw_get_shader_param(shader, param);
+    default:
+       return 0;
+    }
+ }
  
  static float
- softpipe_get_paramf(struct pipe_screen *screen, int param)
+ softpipe_get_paramf(struct pipe_screen *screen, enum pipe_cap param)
  {
     switch (param) {
     case PIPE_CAP_MAX_LINE_WIDTH:
   */
  static boolean
  softpipe_is_format_supported( struct pipe_screen *screen,
-                               enum pipe_format format, 
+                               enum pipe_format format,
                                enum pipe_texture_target target,
+                               unsigned sample_count,
                                unsigned bind,
                                unsigned geom_flags )
  {
     struct sw_winsys *winsys = softpipe_screen(screen)->winsys;
     const struct util_format_description *format_desc;
  
-    assert(target == PIPE_TEXTURE_1D ||
+    assert(target == PIPE_BUFFER ||
+           target == PIPE_TEXTURE_1D ||
            target == PIPE_TEXTURE_2D ||
+           target == PIPE_TEXTURE_RECT ||
            target == PIPE_TEXTURE_3D ||
            target == PIPE_TEXTURE_CUBE);
  
     if (!format_desc)
        return FALSE;
  
+    if (sample_count > 1)
+       return FALSE;
     if (bind & (PIPE_BIND_DISPLAY_TARGET |
                 PIPE_BIND_SCANOUT |
                 PIPE_BIND_SHARED)) {
@@@ -271,11 -296,11 +297,12 @@@ softpipe_create_screen(struct sw_winsy
     screen->base.get_name = softpipe_get_name;
     screen->base.get_vendor = softpipe_get_vendor;
     screen->base.get_param = softpipe_get_param;
+    screen->base.get_shader_param = softpipe_get_shader_param;
     screen->base.get_paramf = softpipe_get_paramf;
     screen->base.is_format_supported = softpipe_is_format_supported;
     screen->base.context_create = softpipe_create_context;
     screen->base.flush_frontbuffer = softpipe_flush_frontbuffer;
 +   screen->base.video_context_create = sp_video_create;
  
     util_format_s3tc_init();
  
index 283181831833fb5a5e10e741f413185b053593d2,8b4663742fa5bd4fcfee53b4143c197095dd6907..9d5700ef439a2cb0c76d94babdccc714407595cc
@@@ -28,7 -28,7 +28,7 @@@
  #ifndef PIPE_DEFINES_H
  #define PIPE_DEFINES_H
  
- #include "p_format.h"
+ #include "p_compiler.h"
  
  #ifdef __cplusplus
  extern "C" {
@@@ -119,11 -119,11 +119,11 @@@ enum pipe_error 
  #define PIPE_POLYGON_MODE_LINE  1
  #define PIPE_POLYGON_MODE_POINT 2
  
- /** Polygon front/back window, also for culling */
- #define PIPE_WINDING_NONE 0
- #define PIPE_WINDING_CW   1
- #define PIPE_WINDING_CCW  2
- #define PIPE_WINDING_BOTH (PIPE_WINDING_CW | PIPE_WINDING_CCW)
+ /** Polygon face specification, eg for culling */
+ #define PIPE_FACE_NONE           0
+ #define PIPE_FACE_FRONT          1
+ #define PIPE_FACE_BACK           2
+ #define PIPE_FACE_FRONT_AND_BACK (PIPE_FACE_FRONT | PIPE_FACE_BACK)
  
  /** Stencil ops */
  #define PIPE_STENCIL_OP_KEEP       0
  #define PIPE_STENCIL_OP_DECR_WRAP  6
  #define PIPE_STENCIL_OP_INVERT     7
  
- /** Texture types */
+ /** Texture types.
+  * See the documentation for info on PIPE_TEXTURE_RECT vs PIPE_TEXTURE_2D */
  enum pipe_texture_target {
     PIPE_BUFFER       = 0,
     PIPE_TEXTURE_1D   = 1,
     PIPE_TEXTURE_2D   = 2,
     PIPE_TEXTURE_3D   = 3,
     PIPE_TEXTURE_CUBE = 4,
+    PIPE_TEXTURE_RECT = 5,
     PIPE_MAX_TEXTURE_TYPES
  };
  
   */
  /** All color buffers currently bound */
  #define PIPE_CLEAR_COLOR        (1 << 0)
+ #define PIPE_CLEAR_DEPTH        (1 << 1)
+ #define PIPE_CLEAR_STENCIL      (1 << 2)
  /** Depth/stencil combined */
- #define PIPE_CLEAR_DEPTHSTENCIL (1 << 1)
+ #define PIPE_CLEAR_DEPTHSTENCIL (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)
  
  /**
   * Transfer object usage flags
@@@ -284,11 -287,10 +287,10 @@@ enum pipe_transfer_usage 
  #define PIPE_BIND_VERTEX_BUFFER        (1 << 3) /* set_vertex_buffers */
  #define PIPE_BIND_INDEX_BUFFER         (1 << 4) /* draw_elements */
  #define PIPE_BIND_CONSTANT_BUFFER      (1 << 5) /* set_constant_buffer */
- #define PIPE_BIND_BLIT_SOURCE          (1 << 6) /* surface_copy */
- #define PIPE_BIND_BLIT_DESTINATION     (1 << 7) /* surface_copy, fill */
  #define PIPE_BIND_DISPLAY_TARGET       (1 << 8) /* flush_front_buffer */
  #define PIPE_BIND_TRANSFER_WRITE       (1 << 9) /* get_transfer */
  #define PIPE_BIND_TRANSFER_READ        (1 << 10) /* get_transfer */
+ #define PIPE_BIND_STREAM_OUTPUT        (1 << 11) /* set_stream_output_buffers */
  #define PIPE_BIND_CUSTOM               (1 << 16) /* state-tracker/winsys usages */
  
  /* The first two flags above were previously part of the amorphous
  #define PIPE_USAGE_STATIC         2 /* same as immutable?? */
  #define PIPE_USAGE_IMMUTABLE      3 /* no change after first upload */
  #define PIPE_USAGE_STREAM         4 /* upload, draw, upload, draw */
+ #define PIPE_USAGE_STAGING        5 /* supports data transfers from the GPU to the CPU */
  
  
  /* These are intended to be used in calls to is_format_supported, but
  #define PIPE_QUERY_OCCLUSION_COUNTER     0
  #define PIPE_QUERY_PRIMITIVES_GENERATED  1
  #define PIPE_QUERY_PRIMITIVES_EMITTED    2
- #define PIPE_QUERY_TYPES                 3
+ #define PIPE_QUERY_TIME_ELAPSED          3
+ #define PIPE_QUERY_SO_STATISTICS         5
+ #define PIPE_QUERY_GPU_FINISHED          6
+ #define PIPE_QUERY_TIMESTAMP_DISJOINT    7
+ #define PIPE_QUERY_TYPES                 8
  
  
  /**
   * Implementation capabilities/limits which are queried through
   * pipe_screen::get_param() and pipe_screen::get_paramf().
   */
- #define PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS 1
- #define PIPE_CAP_NPOT_TEXTURES           2
- #define PIPE_CAP_TWO_SIDED_STENCIL       3
- #define PIPE_CAP_GLSL                    4  /* XXX need something better */
- #define PIPE_CAP_DUAL_SOURCE_BLEND       5  
- #define PIPE_CAP_ANISOTROPIC_FILTER      6
- #define PIPE_CAP_POINT_SPRITE            7
- #define PIPE_CAP_MAX_RENDER_TARGETS      8
- #define PIPE_CAP_OCCLUSION_QUERY         9
- #define PIPE_CAP_TEXTURE_SHADOW_MAP      10
- #define PIPE_CAP_MAX_TEXTURE_2D_LEVELS   11
- #define PIPE_CAP_MAX_TEXTURE_3D_LEVELS   12
- #define PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS 13
- #define PIPE_CAP_MAX_LINE_WIDTH          14
- #define PIPE_CAP_MAX_LINE_WIDTH_AA       15
- #define PIPE_CAP_MAX_POINT_WIDTH         16
- #define PIPE_CAP_MAX_POINT_WIDTH_AA      17
- #define PIPE_CAP_MAX_TEXTURE_ANISOTROPY  18
- #define PIPE_CAP_MAX_TEXTURE_LOD_BIAS    19
- #define PIPE_CAP_GUARD_BAND_LEFT         20  /*< float */
- #define PIPE_CAP_GUARD_BAND_TOP          21  /*< float */
- #define PIPE_CAP_GUARD_BAND_RIGHT        22  /*< float */
- #define PIPE_CAP_GUARD_BAND_BOTTOM       23  /*< float */
- #define PIPE_CAP_TEXTURE_MIRROR_CLAMP    24
- #define PIPE_CAP_TEXTURE_MIRROR_REPEAT   25
- #define PIPE_CAP_MAX_VERTEX_TEXTURE_UNITS 26
- #define PIPE_CAP_TGSI_CONT_SUPPORTED     27
- #define PIPE_CAP_BLEND_EQUATION_SEPARATE 28
- #define PIPE_CAP_SM3                     29  /*< Shader Model 3 supported */
- #define PIPE_CAP_MAX_PREDICATE_REGISTERS 30
- #define PIPE_CAP_MAX_COMBINED_SAMPLERS   31  /*< Maximum texture image units accessible from vertex
-                                                  and fragment shaders combined */
- #define PIPE_CAP_MAX_CONST_BUFFERS       32
- #define PIPE_CAP_MAX_CONST_BUFFER_SIZE   33  /*< In bytes */
- #define PIPE_CAP_INDEP_BLEND_ENABLE      34  /*< blend enables and write masks per rendertarget */
- #define PIPE_CAP_INDEP_BLEND_FUNC        35  /*< different blend funcs per rendertarget */
- #define PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT 36
- #define PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT 37
- #define PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER 38
- #define PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER 39
+ enum pipe_cap {
+    PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS,
+    PIPE_CAP_NPOT_TEXTURES,
+    PIPE_CAP_TWO_SIDED_STENCIL,
+    PIPE_CAP_GLSL,  /* XXX need something better */
+    PIPE_CAP_DUAL_SOURCE_BLEND,
+    PIPE_CAP_ANISOTROPIC_FILTER,
+    PIPE_CAP_POINT_SPRITE,
+    PIPE_CAP_MAX_RENDER_TARGETS,
+    PIPE_CAP_OCCLUSION_QUERY,
+    PIPE_CAP_TIMER_QUERY,
+    PIPE_CAP_TEXTURE_SHADOW_MAP,
+    PIPE_CAP_TEXTURE_SWIZZLE,
+    PIPE_CAP_MAX_TEXTURE_2D_LEVELS,
+    PIPE_CAP_MAX_TEXTURE_3D_LEVELS,
+    PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS,
+    PIPE_CAP_MAX_LINE_WIDTH,
+    PIPE_CAP_MAX_LINE_WIDTH_AA,
+    PIPE_CAP_MAX_POINT_WIDTH,
+    PIPE_CAP_MAX_POINT_WIDTH_AA,
+    PIPE_CAP_MAX_TEXTURE_ANISOTROPY,
+    PIPE_CAP_MAX_TEXTURE_LOD_BIAS,
+    PIPE_CAP_GUARD_BAND_LEFT,  /*< float */
+    PIPE_CAP_GUARD_BAND_TOP,  /*< float */
+    PIPE_CAP_GUARD_BAND_RIGHT,  /*< float */
+    PIPE_CAP_GUARD_BAND_BOTTOM,  /*< float */
+    PIPE_CAP_TEXTURE_MIRROR_CLAMP,
+    PIPE_CAP_TEXTURE_MIRROR_REPEAT,
+    PIPE_CAP_MAX_VERTEX_TEXTURE_UNITS,
+    PIPE_CAP_BLEND_EQUATION_SEPARATE,
+    PIPE_CAP_SM3,  /*< Shader Model, supported */
+    PIPE_CAP_STREAM_OUTPUT,
+    /** Maximum texture image units accessible from vertex and fragment shaders
+     * combined */
+    PIPE_CAP_MAX_COMBINED_SAMPLERS,
+    /** blend enables and write masks per rendertarget */
+    PIPE_CAP_INDEP_BLEND_ENABLE,
+    /** different blend funcs per rendertarget */
+    PIPE_CAP_INDEP_BLEND_FUNC,
+    PIPE_CAP_DEPTHSTENCIL_CLEAR_SEPARATE,
+    PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT,
+    PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT,
+    PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER,
+    PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER,
+    PIPE_CAP_DEPTH_CLAMP
+ };
  
+ /* Shader caps not specific to any single stage */
+ enum pipe_shader_cap
+ {
+    PIPE_SHADER_CAP_MAX_INSTRUCTIONS, /* if 0, it means the stage is unsupported */
+    PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS,
+    PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS,
+    PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS,
+    PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH,
+    PIPE_SHADER_CAP_MAX_INPUTS,
+    PIPE_SHADER_CAP_MAX_CONSTS,
+    PIPE_SHADER_CAP_MAX_CONST_BUFFERS,
+    PIPE_SHADER_CAP_MAX_TEMPS,
+    PIPE_SHADER_CAP_MAX_ADDRS,
+    PIPE_SHADER_CAP_MAX_PREDS,
+    PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED,
+ };
  
  /**
   * Referenced query flags.
  #define PIPE_REFERENCED_FOR_READ  (1 << 0)
  #define PIPE_REFERENCED_FOR_WRITE (1 << 1)
  
 +enum pipe_video_codec
 +{
 +   PIPE_VIDEO_CODEC_UNKNOWN = 0,
 +   PIPE_VIDEO_CODEC_MPEG12,   /**< MPEG1, MPEG2 */
 +   PIPE_VIDEO_CODEC_MPEG4,    /**< DIVX, XVID */
 +   PIPE_VIDEO_CODEC_VC1,      /**< WMV */
 +   PIPE_VIDEO_CODEC_MPEG4_AVC /**< H.264 */
 +};
 +
 +enum pipe_video_profile
 +{
 +   PIPE_VIDEO_PROFILE_MPEG1,
 +   PIPE_VIDEO_PROFILE_MPEG2_SIMPLE,
 +   PIPE_VIDEO_PROFILE_MPEG2_MAIN,
 +   PIPE_VIDEO_PROFILE_MPEG4_SIMPLE,
 +   PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE,
 +   PIPE_VIDEO_PROFILE_VC1_SIMPLE,
 +   PIPE_VIDEO_PROFILE_VC1_MAIN,
 +   PIPE_VIDEO_PROFILE_VC1_ADVANCED,
 +   PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE,
 +   PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN,
 +   PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH
 +};
 +
+ /**
+  * Composite query types
+  */
+ struct pipe_query_data_so_statistics
+ {
+    uint64_t num_primitives_written;
+    uint64_t primitives_storage_needed;
+ };
+ struct pipe_query_data_timestamp_disjoint
+ {
+    uint64_t frequency;
+    boolean  disjoint;
+ };
  
  #ifdef __cplusplus
  }
index 5ca27b3db28a18c87853a36d9c4742f5f21a3c42,06412f4894c8ffcadde6b7b7eb9f71ea5388549b..240e349ba7e599e283e7311812196fd395a7548d
@@@ -29,8 -29,6 +29,6 @@@
  #ifndef PIPE_FORMAT_H
  #define PIPE_FORMAT_H
  
- #include "p_compiler.h"
  #ifdef __cplusplus
  extern "C" {
  #endif
@@@ -188,27 -186,9 +186,27 @@@ enum pipe_format 
     PIPE_FORMAT_R8G8B8X8_UNORM          = 134,
     PIPE_FORMAT_B4G4R4X4_UNORM          = 135,
  
 +   PIPE_FORMAT_YV12                  = 136,
 +   PIPE_FORMAT_YV16                  = 137,
 +   PIPE_FORMAT_IYUV                  = 138,  /**< aka I420 */
 +   PIPE_FORMAT_NV12                  = 139,
 +   PIPE_FORMAT_NV21                  = 140,
 +   PIPE_FORMAT_AYUV                  = PIPE_FORMAT_A8R8G8B8_UNORM,
 +   PIPE_FORMAT_VUYA                  = PIPE_FORMAT_B8G8R8A8_UNORM,
 +   PIPE_FORMAT_XYUV                  = PIPE_FORMAT_X8R8G8B8_UNORM,
 +   PIPE_FORMAT_VUYX                  = PIPE_FORMAT_B8G8R8X8_UNORM,
 +   PIPE_FORMAT_IA44                  = 141,
 +   PIPE_FORMAT_AI44                  = 142,
 +
     PIPE_FORMAT_COUNT
  };
  
 +enum pipe_video_chroma_format
 +{
 +   PIPE_VIDEO_CHROMA_FORMAT_420,
 +   PIPE_VIDEO_CHROMA_FORMAT_422,
 +   PIPE_VIDEO_CHROMA_FORMAT_444
 +};
  
  #ifdef __cplusplus
  }
index 919d1628d05e206db63891ee5ef3f364de1f9779,912631242f51ba52734ee5e06b8d646838374b76..2f22ac22bbf7ca1fd9eee4cadd0d1abf3f022058
@@@ -54,7 -54,6 +54,6 @@@ struct winsys_handle
  /** Opaque type */
  struct pipe_fence_handle;
  struct pipe_winsys;
- struct pipe_texture;
  struct pipe_resource;
  struct pipe_surface;
  struct pipe_transfer;
@@@ -79,21 -78,22 +78,27 @@@ struct pipe_screen 
      * Query an integer-valued capability/parameter/limit
      * \param param  one of PIPE_CAP_x
      */
-    int (*get_param)( struct pipe_screen *, int param );
+    int (*get_param)( struct pipe_screen *, enum pipe_cap param );
  
     /**
      * Query a float-valued capability/parameter/limit
      * \param param  one of PIPE_CAP_x
      */
-    float (*get_paramf)( struct pipe_screen *, int param );
+    float (*get_paramf)( struct pipe_screen *, enum pipe_cap param );
+    /**
+     * Query a per-shader-stage integer-valued capability/parameter/limit
+     * \param param  one of PIPE_CAP_x
+     */
+    int (*get_shader_param)( struct pipe_screen *, unsigned shader, enum pipe_shader_cap param );
  
     struct pipe_context * (*context_create)( struct pipe_screen *,
 -                                          void *priv );
 +                                            void *priv );
 +
 +   struct pipe_video_context * (*video_context_create)( struct pipe_screen *screen,
 +                                                        enum pipe_video_profile profile,
 +                                                        enum pipe_video_chroma_format chroma_format,
 +                                                        unsigned width, unsigned height, void *priv );
  
     /**
      * Check if the given pipe_format is supported as a texture or
     boolean (*is_format_supported)( struct pipe_screen *,
                                     enum pipe_format format,
                                     enum pipe_texture_target target,
-                                    unsigned bindings, 
+                                    unsigned sample_count,
+                                    unsigned bindings,
                                     unsigned geom_flags );
  
     /**
index 9b345e1d9d1928085205844866c40a5a8ff1b341,2f64f312b841cdad42c8f7120ddd8ac10fd4a5b4..9dfe86c8949cfd396eee481794ac5d6022a5fbff
@@@ -6,15 -6,20 +6,21 @@@ LIBNAME = nouveau_dri.s
  PIPE_DRIVERS = \
        $(TOP)/src/gallium/state_trackers/dri/drm/libdridrm.a \
        $(TOP)/src/gallium/winsys/nouveau/drm/libnouveaudrm.a \
+       $(TOP)/src/gallium/drivers/trace/libtrace.a \
+       $(TOP)/src/gallium/drivers/rbug/librbug.a \
        $(TOP)/src/gallium/drivers/nvfx/libnvfx.a \
        $(TOP)/src/gallium/drivers/nv50/libnv50.a \
 +      $(TOP)/src/gallium/drivers/softpipe/libsoftpipe.a \
        $(TOP)/src/gallium/drivers/nouveau/libnouveau.a
  
  C_SOURCES = \
+       target.c \
        $(COMMON_GALLIUM_SOURCES) \
        $(DRIVER_SOURCES)
  
+ DRIVER_DEFINES = \
+       -DGALLIUM_RBUG -DGALLIUM_TRACE
  include ../Makefile.dri
  
  DRI_LIB_DEPS += $(shell pkg-config libdrm_nouveau --libs)
index 9e359a92384b6e6861c2d82e3de166bc1d908c67,0000000000000000000000000000000000000000..831a7603396959b3cc3a71b857a5179d5d5c737a
mode 100644,000000..100644
--- /dev/null
@@@ -1,619 -1,0 +1,618 @@@
- #define NEED_REPLIES
 +/**************************************************************************
 +
 +Copyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
 +Copyright 2000 VA Linux Systems, Inc.
 +All Rights Reserved.
 +
 +Permission is hereby granted, free of charge, to any person obtaining a
 +copy of this software and associated documentation files (the
 +"Software"), to deal in the Software without restriction, including
 +without limitation the rights to use, copy, modify, merge, publish,
 +distribute, sub license, and/or sell copies of the Software, and to
 +permit persons to whom the Software is furnished to do so, subject to
 +the following conditions:
 +
 +The above copyright notice and this permission notice (including the
 +next paragraph) shall be included in all copies or substantial portions
 +of the Software.
 +
 +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
 +IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
 +ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 +
 +**************************************************************************/
 +
 +/*
 + * Authors:
 + *   Kevin E. Martin <martin@valinux.com>
 + *   Jens Owen <jens@tungstengraphics.com>
 + *   Rickard E. (Rik) Faith <faith@valinux.com>
 + *
 + */
 +
 +/* THIS IS NOT AN X CONSORTIUM STANDARD */
 +
 +#include <X11/Xlibint.h>
 +#include <X11/extensions/Xext.h>
 +#include <X11/extensions/extutil.h>
 +#include "xf86dristr.h"
 +
 +static XExtensionInfo _xf86dri_info_data;
 +static XExtensionInfo *xf86dri_info = &_xf86dri_info_data;
 +static char xf86dri_extension_name[] = XF86DRINAME;
 +
 +#define XF86DRICheckExtension(dpy,i,val) \
 +  XextCheckExtension (dpy, i, xf86dri_extension_name, val)
 +
 +/*****************************************************************************
 + *                                                                           *
 + *                       private utility routines                          *
 + *                                                                           *
 + *****************************************************************************/
 +
 +static int close_display(Display *dpy, XExtCodes *extCodes);
 +static /* const */ XExtensionHooks xf86dri_extension_hooks = {
 +    NULL,                             /* create_gc */
 +    NULL,                             /* copy_gc */
 +    NULL,                             /* flush_gc */
 +    NULL,                             /* free_gc */
 +    NULL,                             /* create_font */
 +    NULL,                             /* free_font */
 +    close_display,                    /* close_display */
 +    NULL,                             /* wire_to_event */
 +    NULL,                             /* event_to_wire */
 +    NULL,                             /* error */
 +    NULL,                             /* error_string */
 +};
 +
 +static XEXT_GENERATE_FIND_DISPLAY (find_display, xf86dri_info, 
 +                                 xf86dri_extension_name, 
 +                                 &xf86dri_extension_hooks, 
 +                                 0, NULL)
 +
 +static XEXT_GENERATE_CLOSE_DISPLAY (close_display, xf86dri_info)
 +
 +
 +/*****************************************************************************
 + *                                                                           *
 + *                public XFree86-DRI Extension routines                    *
 + *                                                                           *
 + *****************************************************************************/
 +
 +#if 0
 +#include <stdio.h>
 +#define TRACE(msg)  fprintf(stderr,"XF86DRI%s\n", msg);
 +#else
 +#define TRACE(msg)
 +#endif
 +
 +#define PUBLIC
 +
 +PUBLIC Bool XF86DRIQueryExtension (dpy, event_basep, error_basep)
 +    Display *dpy;
 +    int *event_basep, *error_basep;
 +{
 +    XExtDisplayInfo *info = find_display (dpy);
 +
 +    TRACE("QueryExtension...");
 +    if (XextHasExtension(info)) {
 +      *event_basep = info->codes->first_event;
 +      *error_basep = info->codes->first_error;
 +        TRACE("QueryExtension... return True");
 +      return True;
 +    } else {
 +        TRACE("QueryExtension... return False");
 +      return False;
 +    }
 +}
 +
 +PUBLIC Bool XF86DRIQueryVersion(dpy, majorVersion, minorVersion, patchVersion)
 +    Display* dpy;
 +    int* majorVersion; 
 +    int* minorVersion;
 +    int* patchVersion;
 +{
 +    XExtDisplayInfo *info = find_display (dpy);
 +    xXF86DRIQueryVersionReply rep;
 +    xXF86DRIQueryVersionReq *req;
 +
 +    TRACE("QueryVersion...");
 +    XF86DRICheckExtension (dpy, info, False);
 +
 +    LockDisplay(dpy);
 +    GetReq(XF86DRIQueryVersion, req);
 +    req->reqType = info->codes->major_opcode;
 +    req->driReqType = X_XF86DRIQueryVersion;
 +    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
 +      UnlockDisplay(dpy);
 +      SyncHandle();
 +        TRACE("QueryVersion... return False");
 +      return False;
 +    }
 +    *majorVersion = rep.majorVersion;
 +    *minorVersion = rep.minorVersion;
 +    *patchVersion = rep.patchVersion;
 +    UnlockDisplay(dpy);
 +    SyncHandle();
 +    TRACE("QueryVersion... return True");
 +    return True;
 +}
 +
 +PUBLIC Bool XF86DRIQueryDirectRenderingCapable(dpy, screen, isCapable)
 +    Display* dpy;
 +    int screen;
 +    Bool* isCapable;
 +{
 +    XExtDisplayInfo *info = find_display (dpy);
 +    xXF86DRIQueryDirectRenderingCapableReply rep;
 +    xXF86DRIQueryDirectRenderingCapableReq *req;
 +
 +    TRACE("QueryDirectRenderingCapable...");
 +    XF86DRICheckExtension (dpy, info, False);
 +
 +    LockDisplay(dpy);
 +    GetReq(XF86DRIQueryDirectRenderingCapable, req);
 +    req->reqType = info->codes->major_opcode;
 +    req->driReqType = X_XF86DRIQueryDirectRenderingCapable;
 +    req->screen = screen;
 +    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
 +      UnlockDisplay(dpy);
 +      SyncHandle();
 +        TRACE("QueryDirectRenderingCapable... return False");
 +      return False;
 +    }
 +    *isCapable = rep.isCapable;
 +    UnlockDisplay(dpy);
 +    SyncHandle();
 +    TRACE("QueryDirectRenderingCapable... return True");
 +    return True;
 +}
 +
 +PUBLIC Bool XF86DRIOpenConnection(dpy, screen, hSAREA, busIdString)
 +    Display* dpy;
 +    int screen;
 +    drm_handle_t * hSAREA;
 +    char **busIdString;
 +{
 +    XExtDisplayInfo *info = find_display (dpy);
 +    xXF86DRIOpenConnectionReply rep;
 +    xXF86DRIOpenConnectionReq *req;
 +
 +    TRACE("OpenConnection...");
 +    XF86DRICheckExtension (dpy, info, False);
 +
 +    LockDisplay(dpy);
 +    GetReq(XF86DRIOpenConnection, req);
 +    req->reqType = info->codes->major_opcode;
 +    req->driReqType = X_XF86DRIOpenConnection;
 +    req->screen = screen;
 +    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
 +      UnlockDisplay(dpy);
 +      SyncHandle();
 +        TRACE("OpenConnection... return False");
 +      return False;
 +    }
 +
 +    *hSAREA = rep.hSAREALow;
 +    if (sizeof(drm_handle_t) == 8) {
 +       int shift = 32; /* var to prevent warning on next line */
 +       *hSAREA |= ((drm_handle_t) rep.hSAREAHigh) << shift;
 +    }
 +
 +    if (rep.length) {
 +        if (!(*busIdString = (char *)Xcalloc(rep.busIdStringLength + 1, 1))) {
 +            _XEatData(dpy, ((rep.busIdStringLength+3) & ~3));
 +            UnlockDisplay(dpy);
 +            SyncHandle();
 +            TRACE("OpenConnection... return False");
 +            return False;
 +        }
 +      _XReadPad(dpy, *busIdString, rep.busIdStringLength);
 +    } else {
 +        *busIdString = NULL;
 +    }
 +    UnlockDisplay(dpy);
 +    SyncHandle();
 +    TRACE("OpenConnection... return True");
 +    return True;
 +}
 +
 +PUBLIC Bool XF86DRIAuthConnection(dpy, screen, magic)
 +    Display* dpy;
 +    int screen;
 +    drm_magic_t magic;
 +{
 +    XExtDisplayInfo *info = find_display (dpy);
 +    xXF86DRIAuthConnectionReq *req;
 +    xXF86DRIAuthConnectionReply rep;
 +
 +    TRACE("AuthConnection...");
 +    XF86DRICheckExtension (dpy, info, False);
 +
 +    LockDisplay(dpy);
 +    GetReq(XF86DRIAuthConnection, req);
 +    req->reqType = info->codes->major_opcode;
 +    req->driReqType = X_XF86DRIAuthConnection;
 +    req->screen = screen;
 +    req->magic = magic;
 +    rep.authenticated = 0;
 +    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse) || !rep.authenticated) {
 +      UnlockDisplay(dpy);
 +      SyncHandle();
 +        TRACE("AuthConnection... return False");
 +      return False;
 +    }
 +    UnlockDisplay(dpy);
 +    SyncHandle();
 +    TRACE("AuthConnection... return True");
 +    return True;
 +}
 +
 +PUBLIC Bool XF86DRICloseConnection(dpy, screen)
 +    Display* dpy;
 +    int screen;
 +{
 +    XExtDisplayInfo *info = find_display (dpy);
 +    xXF86DRICloseConnectionReq *req;
 +
 +    TRACE("CloseConnection...");
 +
 +    XF86DRICheckExtension (dpy, info, False);
 +
 +    LockDisplay(dpy);
 +    GetReq(XF86DRICloseConnection, req);
 +    req->reqType = info->codes->major_opcode;
 +    req->driReqType = X_XF86DRICloseConnection;
 +    req->screen = screen;
 +    UnlockDisplay(dpy);
 +    SyncHandle();
 +    TRACE("CloseConnection... return True");
 +    return True;
 +}
 +
 +PUBLIC Bool XF86DRIGetClientDriverName(dpy, screen, ddxDriverMajorVersion, 
 +      ddxDriverMinorVersion, ddxDriverPatchVersion, clientDriverName)
 +    Display* dpy;
 +    int screen;
 +    int* ddxDriverMajorVersion;
 +    int* ddxDriverMinorVersion;
 +    int* ddxDriverPatchVersion;
 +    char** clientDriverName;
 +{
 +    XExtDisplayInfo *info = find_display (dpy);
 +    xXF86DRIGetClientDriverNameReply rep;
 +    xXF86DRIGetClientDriverNameReq *req;
 +
 +    TRACE("GetClientDriverName...");
 +    XF86DRICheckExtension (dpy, info, False);
 +
 +    LockDisplay(dpy);
 +    GetReq(XF86DRIGetClientDriverName, req);
 +    req->reqType = info->codes->major_opcode;
 +    req->driReqType = X_XF86DRIGetClientDriverName;
 +    req->screen = screen;
 +    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
 +      UnlockDisplay(dpy);
 +      SyncHandle();
 +        TRACE("GetClientDriverName... return False");
 +      return False;
 +    }
 +
 +    *ddxDriverMajorVersion = rep.ddxDriverMajorVersion;
 +    *ddxDriverMinorVersion = rep.ddxDriverMinorVersion;
 +    *ddxDriverPatchVersion = rep.ddxDriverPatchVersion;
 +
 +    if (rep.length) {
 +        if (!(*clientDriverName = (char *)Xcalloc(rep.clientDriverNameLength + 1, 1))) {
 +            _XEatData(dpy, ((rep.clientDriverNameLength+3) & ~3));
 +            UnlockDisplay(dpy);
 +            SyncHandle();
 +            TRACE("GetClientDriverName... return False");
 +            return False;
 +        }
 +      _XReadPad(dpy, *clientDriverName, rep.clientDriverNameLength);
 +    } else {
 +        *clientDriverName = NULL;
 +    }
 +    UnlockDisplay(dpy);
 +    SyncHandle();
 +    TRACE("GetClientDriverName... return True");
 +    return True;
 +}
 +
 +PUBLIC Bool XF86DRICreateContextWithConfig(dpy, screen, configID, context,
 +      hHWContext)
 +    Display* dpy;
 +    int screen;
 +    int configID;
 +    XID* context;
 +    drm_context_t * hHWContext;
 +{
 +    XExtDisplayInfo *info = find_display (dpy);
 +    xXF86DRICreateContextReply rep;
 +    xXF86DRICreateContextReq *req;
 +
 +    TRACE("CreateContext...");
 +    XF86DRICheckExtension (dpy, info, False);
 +
 +    LockDisplay(dpy);
 +    GetReq(XF86DRICreateContext, req);
 +    req->reqType = info->codes->major_opcode;
 +    req->driReqType = X_XF86DRICreateContext;
 +    req->visual = configID;
 +    req->screen = screen;
 +    *context = XAllocID(dpy);
 +    req->context = *context;
 +    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
 +      UnlockDisplay(dpy);
 +      SyncHandle();
 +        TRACE("CreateContext... return False");
 +      return False;
 +    }
 +    *hHWContext = rep.hHWContext;
 +    UnlockDisplay(dpy);
 +    SyncHandle();
 +    TRACE("CreateContext... return True");
 +    return True;
 +}
 +
 +PUBLIC Bool XF86DRICreateContext(dpy, screen, visual, context, hHWContext)
 +    Display* dpy;
 +    int screen;
 +    Visual* visual;
 +    XID* context;
 +    drm_context_t * hHWContext;
 +{
 +    return XF86DRICreateContextWithConfig( dpy, screen, visual->visualid,
 +                                         context, hHWContext );
 +}
 +
 +PUBLIC Bool XF86DRIDestroyContext( Display * ndpy, int screen, 
 +    XID context )
 +{
 +    Display * const dpy = (Display *) ndpy;
 +    XExtDisplayInfo *info = find_display (dpy);
 +    xXF86DRIDestroyContextReq *req;
 +
 +    TRACE("DestroyContext...");
 +    XF86DRICheckExtension (dpy, info, False);
 +
 +    LockDisplay(dpy);
 +    GetReq(XF86DRIDestroyContext, req);
 +    req->reqType = info->codes->major_opcode;
 +    req->driReqType = X_XF86DRIDestroyContext;
 +    req->screen = screen;
 +    req->context = context;
 +    UnlockDisplay(dpy);
 +    SyncHandle();
 +    TRACE("DestroyContext... return True");
 +    return True;
 +}
 +
 +PUBLIC Bool XF86DRICreateDrawable( Display * ndpy, int screen, 
 +    Drawable drawable, drm_drawable_t * hHWDrawable )
 +{
 +    Display * const dpy = (Display *) ndpy;
 +    XExtDisplayInfo *info = find_display (dpy);
 +    xXF86DRICreateDrawableReply rep;
 +    xXF86DRICreateDrawableReq *req;
 +
 +    TRACE("CreateDrawable...");
 +    XF86DRICheckExtension (dpy, info, False);
 +
 +    LockDisplay(dpy);
 +    GetReq(XF86DRICreateDrawable, req);
 +    req->reqType = info->codes->major_opcode;
 +    req->driReqType = X_XF86DRICreateDrawable;
 +    req->screen = screen;
 +    req->drawable = drawable;
 +    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
 +      UnlockDisplay(dpy);
 +      SyncHandle();
 +        TRACE("CreateDrawable... return False");
 +      return False;
 +    }
 +    *hHWDrawable = rep.hHWDrawable;
 +    UnlockDisplay(dpy);
 +    SyncHandle();
 +    TRACE("CreateDrawable... return True");
 +    return True;
 +}
 +
 +PUBLIC Bool XF86DRIDestroyDrawable( Display * ndpy, int screen,
 +    Drawable drawable )
 +{
 +    Display * const dpy = (Display *) ndpy;
 +    XExtDisplayInfo *info = find_display (dpy);
 +    xXF86DRIDestroyDrawableReq *req;
 +
 +    TRACE("DestroyDrawable...");
 +    XF86DRICheckExtension (dpy, info, False);
 +
 +    LockDisplay(dpy);
 +    GetReq(XF86DRIDestroyDrawable, req);
 +    req->reqType = info->codes->major_opcode;
 +    req->driReqType = X_XF86DRIDestroyDrawable;
 +    req->screen = screen;
 +    req->drawable = drawable;
 +    UnlockDisplay(dpy);
 +    SyncHandle();
 +    TRACE("DestroyDrawable... return True");
 +    return True;
 +}
 +
 +PUBLIC Bool XF86DRIGetDrawableInfo(Display* dpy, int screen, Drawable drawable,
 +    unsigned int* index, unsigned int* stamp,
 +    int* X, int* Y, int* W, int* H,
 +    int* numClipRects, drm_clip_rect_t ** pClipRects,
 +    int* backX, int* backY,
 +    int* numBackClipRects, drm_clip_rect_t ** pBackClipRects )
 +{
 +    XExtDisplayInfo *info = find_display (dpy);
 +    xXF86DRIGetDrawableInfoReply rep;
 +    xXF86DRIGetDrawableInfoReq *req;
 +    int total_rects;
 +
 +    TRACE("GetDrawableInfo...");
 +    XF86DRICheckExtension (dpy, info, False);
 +
 +    LockDisplay(dpy);
 +    GetReq(XF86DRIGetDrawableInfo, req);
 +    req->reqType = info->codes->major_opcode;
 +    req->driReqType = X_XF86DRIGetDrawableInfo;
 +    req->screen = screen;
 +    req->drawable = drawable;
 +
 +    if (!_XReply(dpy, (xReply *)&rep, 1, xFalse)) 
 +    {
 +      UnlockDisplay(dpy);
 +      SyncHandle();
 +        TRACE("GetDrawableInfo... return False");
 +      return False;
 +    }
 +    *index = rep.drawableTableIndex;
 +    *stamp = rep.drawableTableStamp;
 +    *X = (int)rep.drawableX;
 +    *Y = (int)rep.drawableY;
 +    *W = (int)rep.drawableWidth;
 +    *H = (int)rep.drawableHeight;
 +    *numClipRects = rep.numClipRects;
 +    total_rects = *numClipRects;
 +
 +    *backX = rep.backX;
 +    *backY = rep.backY;
 +    *numBackClipRects = rep.numBackClipRects;
 +    total_rects += *numBackClipRects;
 +
 +#if 0
 +    /* Because of the fix in Xserver/GL/dri/xf86dri.c, this check breaks
 +     * backwards compatibility (Because of the >> 2 shift) but the fix
 +     * enables multi-threaded apps to work.
 +     */
 +    if (rep.length !=  ((((SIZEOF(xXF86DRIGetDrawableInfoReply) - 
 +                     SIZEOF(xGenericReply) + 
 +                     total_rects * sizeof(drm_clip_rect_t)) + 3) & ~3) >> 2)) {
 +        _XEatData(dpy, rep.length);
 +      UnlockDisplay(dpy);
 +      SyncHandle();
 +        TRACE("GetDrawableInfo... return False");
 +        return False;
 +    }
 +#endif
 +
 +    if (*numClipRects) {
 +       int len = sizeof(drm_clip_rect_t) * (*numClipRects);
 +
 +       *pClipRects = (drm_clip_rect_t *)Xcalloc(len, 1);
 +       if (*pClipRects) 
 +        _XRead(dpy, (char*)*pClipRects, len);
 +    } else {
 +        *pClipRects = NULL;
 +    }
 +
 +    if (*numBackClipRects) {
 +       int len = sizeof(drm_clip_rect_t) * (*numBackClipRects);
 +
 +       *pBackClipRects = (drm_clip_rect_t *)Xcalloc(len, 1);
 +       if (*pBackClipRects) 
 +        _XRead(dpy, (char*)*pBackClipRects, len);
 +    } else {
 +        *pBackClipRects = NULL;
 +    }
 +
 +    UnlockDisplay(dpy);
 +    SyncHandle();
 +    TRACE("GetDrawableInfo... return True");
 +    return True;
 +}
 +
 +PUBLIC Bool XF86DRIGetDeviceInfo(dpy, screen, hFrameBuffer, 
 +      fbOrigin, fbSize, fbStride, devPrivateSize, pDevPrivate)
 +    Display* dpy;
 +    int screen;
 +    drm_handle_t * hFrameBuffer;
 +    int* fbOrigin;
 +    int* fbSize;
 +    int* fbStride;
 +    int* devPrivateSize;
 +    void** pDevPrivate;
 +{
 +    XExtDisplayInfo *info = find_display (dpy);
 +    xXF86DRIGetDeviceInfoReply rep;
 +    xXF86DRIGetDeviceInfoReq *req;
 +
 +    TRACE("GetDeviceInfo...");
 +    XF86DRICheckExtension (dpy, info, False);
 +
 +    LockDisplay(dpy);
 +    GetReq(XF86DRIGetDeviceInfo, req);
 +    req->reqType = info->codes->major_opcode;
 +    req->driReqType = X_XF86DRIGetDeviceInfo;
 +    req->screen = screen;
 +    if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
 +      UnlockDisplay(dpy);
 +      SyncHandle();
 +        TRACE("GetDeviceInfo... return False");
 +      return False;
 +    }
 +
 +    *hFrameBuffer = rep.hFrameBufferLow;
 +    if (sizeof(drm_handle_t) == 8) {
 +       int shift = 32; /* var to prevent warning on next line */
 +       *hFrameBuffer |= ((drm_handle_t) rep.hFrameBufferHigh) << shift;
 +    }
 +
 +    *fbOrigin = rep.framebufferOrigin;
 +    *fbSize = rep.framebufferSize;
 +    *fbStride = rep.framebufferStride;
 +    *devPrivateSize = rep.devPrivateSize;
 +
 +    if (rep.length) {
 +        if (!(*pDevPrivate = (void *)Xcalloc(rep.devPrivateSize, 1))) {
 +            _XEatData(dpy, ((rep.devPrivateSize+3) & ~3));
 +            UnlockDisplay(dpy);
 +            SyncHandle();
 +            TRACE("GetDeviceInfo... return False");
 +            return False;
 +        }
 +      _XRead(dpy, (char*)*pDevPrivate, rep.devPrivateSize);
 +    } else {
 +        *pDevPrivate = NULL;
 +    }
 +
 +    UnlockDisplay(dpy);
 +    SyncHandle();
 +    TRACE("GetDeviceInfo... return True");
 +    return True;
 +}
 +
 +PUBLIC Bool XF86DRIOpenFullScreen(dpy, screen, drawable)
 +    Display* dpy;
 +    int screen;
 +    Drawable drawable;
 +{
 +    /* This function and the underlying X protocol are deprecated.
 +     */
 +    (void) dpy;
 +    (void) screen;
 +    (void) drawable;
 +    return False;
 +}
 +
 +PUBLIC Bool XF86DRICloseFullScreen(dpy, screen, drawable)
 +    Display* dpy;
 +    int screen;
 +    Drawable drawable;
 +{
 +    /* This function and the underlying X protocol are deprecated.
 +     */
 +    (void) dpy;
 +    (void) screen;
 +    (void) drawable;
 +    return True;
 +}
 +