do clipping prior to XGetImage, just in case the image would extend beyond the screen...
[mesa.git] / src / mesa / drivers / x11 / xm_api.c
index 9ee36a45ca03e1751ae7e566a0c752e685e1dcc6..6255c3b79421af9d054c9c24da0f4c384f2a9361 100644 (file)
@@ -1,10 +1,8 @@
-/* $Id: xm_api.c,v 1.35 2002/03/16 00:53:15 brianp Exp $ */
-
 /*
  * Mesa 3-D graphics library
- * Version:  4.0.2
+ * Version:  6.3
  *
- * Copyright (C) 1999-2002  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2004  Brian Paul   All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -23,7 +21,6 @@
  * 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.
  */
-/* $XFree86: xc/extras/Mesa/src/X/xm_api.c,v 1.2 2002/02/26 23:37:31 tsi Exp $ */
 
 /*
  * This file contains the implementations of all the XMesa* functions.
 #include "context.h"
 #include "extensions.h"
 #include "glthread.h"
+#include "imports.h"
 #include "matrix.h"
-#include "mem.h"
-#include "mmath.h"
 #include "mtypes.h"
-#ifdef HAVE_CONFIG_H
-#include "conf.h"
-#endif
 #include "macros.h"
 #include "texformat.h"
+#include "texobj.h"
 #include "texstore.h"
 #include "swrast/swrast.h"
 #include "swrast_setup/swrast_setup.h"
 #include "array_cache/acache.h"
 #include "tnl/tnl.h"
+#include "tnl/t_context.h"
+#include "tnl/t_pipeline.h"
+#include "drivers/common/driverfuncs.h"
 
-#ifndef GLX_NONE_EXT
-#define GLX_NONE_EXT 0x8000
+#ifdef XFree86Server
+#include <GL/glxtokens.h>
 #endif
 
-
 /*
  * Global X driver lock
  */
@@ -163,18 +159,6 @@ static short hpcr_rgbTbl[3][256] = {
 /**********************************************************************/
 
 
-/*
- * X/Mesa error reporting function:
- */
-static void error( const char *msg )
-{
-   (void)DitherValues;         /* Muffle compiler */
-
-   if (getenv("MESA_DEBUG"))
-      fprintf( stderr, "X/Mesa error: %s\n", msg );
-}
-
-
 /*
  * Return the host's byte order as LSBFirst or MSBFirst ala X.
  */
@@ -192,7 +176,7 @@ static int host_byte_order( void )
  * Error handling.
  */
 #ifndef XFree86Server
-static int mesaXErrorFlag = 0;
+static volatile int mesaXErrorFlag = 0;
 
 static int mesaHandleXError( XMesaDisplay *dpy, XErrorEvent *event )
 {
@@ -269,7 +253,7 @@ static GLint gamma_adjust( GLfloat gamma, GLint value, GLint max )
    }
    else {
       double x = (double) value / (double) max;
-      return IROUND_POS((GLfloat) max * pow(x, 1.0F/gamma));
+      return IROUND_POS((GLfloat) max * _mesa_pow(x, 1.0F/gamma));
    }
 }
 
@@ -283,14 +267,11 @@ static GLint gamma_adjust( GLfloat gamma, GLint value, GLint max )
  *         visinfo - desribes the visual to be used for XImages
  * Return:  true number of bits per pixel for XImages
  */
-#define GET_BITS_PER_PIXEL(xmv) bits_per_pixel(xmv)
-
 #ifdef XFree86Server
 
 static int bits_per_pixel( XMesaVisual xmv )
 {
-   XMesaVisualInfo visinfo = xmv->visinfo;
-   const int depth = visinfo->nplanes;
+   const int depth = xmv->nplanes;
    int i;
    for (i = 0; i < screenInfo.numPixmapFormats; i++) {
       if (screenInfo.formats[i].depth == depth)
@@ -501,7 +482,7 @@ static GLboolean alloc_shm_back_buffer( XMesaBuffer b )
                                   ZPixmap, NULL, &b->shminfo,
                                   b->width, b->height );
    if (b->backimage == NULL) {
-      error("alloc_back_buffer: Shared memory error (XShmCreateImage), disabling.");
+      _mesa_warning(NULL, "alloc_back_buffer: Shared memory error (XShmCreateImage), disabling.");
       b->shm = 0;
       return GL_FALSE;
    }
@@ -509,11 +490,10 @@ static GLboolean alloc_shm_back_buffer( XMesaBuffer b )
    b->shminfo.shmid = shmget( IPC_PRIVATE, b->backimage->bytes_per_line
                             * b->backimage->height, IPC_CREAT|0777 );
    if (b->shminfo.shmid < 0) {
-      if (getenv("MESA_DEBUG"))
-          perror("alloc_back_buffer");
+      _mesa_warning(NULL, "shmget failed while allocating back buffer");
       XDestroyImage( b->backimage );
       b->backimage = NULL;
-      error("alloc_back_buffer: Shared memory error (shmget), disabling.");
+      _mesa_warning(NULL, "alloc_back_buffer: Shared memory error (shmget), disabling.");
       b->shm = 0;
       return GL_FALSE;
    }
@@ -521,12 +501,11 @@ static GLboolean alloc_shm_back_buffer( XMesaBuffer b )
    b->shminfo.shmaddr = b->backimage->data
                       = (char*)shmat( b->shminfo.shmid, 0, 0 );
    if (b->shminfo.shmaddr == (char *) -1) {
-      if (getenv("MESA_DEBUG"))
-          perror("alloc_back_buffer");
+      _mesa_warning(NULL, "shmat() failed while allocating back buffer");
       XDestroyImage( b->backimage );
       shmctl( b->shminfo.shmid, IPC_RMID, 0 );
       b->backimage = NULL;
-      error("alloc_back_buffer: Shared memory error (shmat), disabling.");
+      _mesa_warning(NULL, "alloc_back_buffer: Shared memory error (shmat), disabling.");
       b->shm = 0;
       return GL_FALSE;
    }
@@ -629,9 +608,7 @@ void xmesa_alloc_back_buffer( XMesaBuffer b )
         b->backimage = XMesaCreateImage(b->xm_visual->BitsPerPixel,
                                         b->width, b->height, NULL);
 #else
-      if (b->shm==0
-         || alloc_shm_back_buffer(b)==GL_FALSE
-         ) {
+      if (b->shm==0 || alloc_shm_back_buffer(b)==GL_FALSE) {
         /* Allocate a regular XImage for the back buffer. */
         b->backimage = XCreateImage( b->xm_visual->display,
                                       b->xm_visual->visinfo->visual,
@@ -641,12 +618,12 @@ void xmesa_alloc_back_buffer( XMesaBuffer b )
                                      8, 0 );  /* pad, bytes_per_line */
 #endif
         if (!b->backimage) {
-           error("alloc_back_buffer: XCreateImage failed.");
+           _mesa_warning(NULL, "alloc_back_buffer: XCreateImage failed.");
         }
          b->backimage->data = (char *) MALLOC( b->backimage->height
                                              * b->backimage->bytes_per_line );
          if (!b->backimage->data) {
-            error("alloc_back_buffer: MALLOC failed.");
+            _mesa_warning(NULL, "alloc_back_buffer: MALLOC failed.");
             XMesaDestroyImage( b->backimage );
             b->backimage = NULL;
          }
@@ -879,16 +856,16 @@ static GLboolean setup_grayscale( int client, XMesaVisual v,
             buffer->pixel_to_b[xcol.pixel] = gray;
          }
 
-         if (colorsfailed && getenv("MESA_DEBUG")) {
-            fprintf( stderr,
+         if (colorsfailed && _mesa_getenv("MESA_DEBUG")) {
+            _mesa_warning(NULL,
                   "Note: %d out of 256 needed colors do not match exactly.\n",
                   colorsfailed );
          }
       }
    }
 
-   v->dithered_pf = PF_GRAYSCALE;
-   v->undithered_pf = PF_GRAYSCALE;
+   v->dithered_pf = PF_Grayscale;
+   v->undithered_pf = PF_Grayscale;
    return GL_TRUE;
 }
 
@@ -929,14 +906,14 @@ static GLboolean setup_dithered_color( int client, XMesaVisual v,
          /* Allocate X colors and initialize color_table[], red_table[], etc */
          int r, g, b, i;
          int colorsfailed = 0;
-         for (r = 0; r < _R; r++) {
-            for (g = 0; g < _G; g++) {
-               for (b = 0; b < _B; b++) {
+         for (r = 0; r < DITH_R; r++) {
+            for (g = 0; g < DITH_G; g++) {
+               for (b = 0; b < DITH_B; b++) {
                   XMesaColor xcol;
                   int exact, alloced;
-                  xcol.red  =gamma_adjust(v->RedGamma,   r*65535/(_R-1),65535);
-                  xcol.green=gamma_adjust(v->GreenGamma, g*65535/(_G-1),65535);
-                  xcol.blue =gamma_adjust(v->BlueGamma,  b*65535/(_B-1),65535);
+                  xcol.red  =gamma_adjust(v->RedGamma,   r*65535/(DITH_R-1),65535);
+                  xcol.green=gamma_adjust(v->GreenGamma, g*65535/(DITH_G-1),65535);
+                  xcol.blue =gamma_adjust(v->BlueGamma,  b*65535/(DITH_B-1),65535);
                   noFaultXAllocColor( client, v->display,
                                       cmap, GET_COLORMAP_SIZE(v),
                                       &xcol, &exact, &alloced );
@@ -948,27 +925,27 @@ static GLboolean setup_dithered_color( int client, XMesaVisual v,
                      buffer->alloced_colors[buffer->num_alloced] = xcol.pixel;
                      buffer->num_alloced++;
                   }
-                  i = _MIX( r, g, b );
+                  i = DITH_MIX( r, g, b );
                   assert(i < 576);
                   buffer->color_table[i] = xcol.pixel;
                   assert(xcol.pixel < 65536);
-                  buffer->pixel_to_r[xcol.pixel] = r * 255 / (_R-1);
-                  buffer->pixel_to_g[xcol.pixel] = g * 255 / (_G-1);
-                  buffer->pixel_to_b[xcol.pixel] = b * 255 / (_B-1);
+                  buffer->pixel_to_r[xcol.pixel] = r * 255 / (DITH_R-1);
+                  buffer->pixel_to_g[xcol.pixel] = g * 255 / (DITH_G-1);
+                  buffer->pixel_to_b[xcol.pixel] = b * 255 / (DITH_B-1);
                }
             }
          }
 
-         if (colorsfailed && getenv("MESA_DEBUG")) {
-            fprintf( stderr,
+         if (colorsfailed && _mesa_getenv("MESA_DEBUG")) {
+            _mesa_warning(NULL,
                   "Note: %d out of %d needed colors do not match exactly.\n",
-                  colorsfailed, _R*_G*_B );
+                  colorsfailed, DITH_R * DITH_G * DITH_B );
          }
       }
    }
 
-   v->dithered_pf = PF_DITHER;
-   v->undithered_pf = PF_LOOKUP;
+   v->dithered_pf = PF_Dither;
+   v->undithered_pf = PF_Lookup;
    return GL_TRUE;
 }
 
@@ -993,19 +970,19 @@ static void setup_8bit_hpcr( XMesaVisual v )
 
    g = 1.0 / v->RedGamma;
    for (i=0; i<256; i++) {
-      GLint red = IROUND_POS(255.0 * pow( hpcr_rgbTbl[0][i]/255.0, g ));
+      GLint red = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[0][i]/255.0, g ));
       v->hpcr_rgbTbl[0][i] = CLAMP( red, 16, 239 );
    }
 
    g = 1.0 / v->GreenGamma;
    for (i=0; i<256; i++) {
-      GLint green = IROUND_POS(255.0 * pow( hpcr_rgbTbl[1][i]/255.0, g ));
+      GLint green = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[1][i]/255.0, g ));
       v->hpcr_rgbTbl[1][i] = CLAMP( green, 16, 239 );
    }
 
    g = 1.0 / v->BlueGamma;
    for (i=0; i<256; i++) {
-      GLint blue = IROUND_POS(255.0 * pow( hpcr_rgbTbl[2][i]/255.0, g ));
+      GLint blue = IROUND_POS(255.0 * _mesa_pow( hpcr_rgbTbl[2][i]/255.0, g ));
       v->hpcr_rgbTbl[2][i] = CLAMP( blue, 32, 223 );
    }
    v->undithered_pf = PF_HPCR;  /* can't really disable dithering for now */
@@ -1014,7 +991,7 @@ static void setup_8bit_hpcr( XMesaVisual v )
    /* which method should I use to clear */
    /* GL_FALSE: keep the ordinary method  */
    /* GL_TRUE : clear with dither pattern */
-   v->hpcr_clear_flag = getenv("MESA_HPCR_CLEAR") ? GL_TRUE : GL_FALSE;
+   v->hpcr_clear_flag = _mesa_getenv("MESA_HPCR_CLEAR") ? GL_TRUE : GL_FALSE;
 
    if (v->hpcr_clear_flag) {
       v->hpcr_clear_pixmap = XMesaCreatePixmap(v->display,
@@ -1111,8 +1088,8 @@ static void setup_truecolor( XMesaVisual v, XMesaBuffer buffer,
          v->Kernel[i] = kernel[i] >> maxBits;
       }
 
-      v->undithered_pf = PF_TRUECOLOR;
-      v->dithered_pf = (GET_VISUAL_DEPTH(v)<24) ? PF_TRUEDITHER : PF_TRUECOLOR;
+      v->undithered_pf = PF_Truecolor;
+      v->dithered_pf = (GET_VISUAL_DEPTH(v)<24) ? PF_Dither_True : PF_Truecolor;
    }
 
    /*
@@ -1157,7 +1134,7 @@ static void setup_truecolor( XMesaVisual v, XMesaBuffer buffer,
        && v->RedGamma==1.0 && v->GreenGamma==1.0 && v->BlueGamma==1.0) {
       /* 5-6-5 color weight on common PC VGA boards */
       v->undithered_pf = PF_5R6G5B;
-      v->dithered_pf = PF_DITHER_5R6G5B;
+      v->dithered_pf = PF_Dither_5R6G5B;
    }
    else if (GET_REDMASK(v)  ==0xe0
        &&   GET_GREENMASK(v)==0x1c
@@ -1175,7 +1152,7 @@ static void setup_truecolor( XMesaVisual v, XMesaBuffer buffer,
 static void setup_monochrome( XMesaVisual v, XMesaBuffer b )
 {
    (void) b;
-   v->dithered_pf = v->undithered_pf = PF_1BIT;
+   v->dithered_pf = v->undithered_pf = PF_1Bit;
    /* if black=1 then we must flip pixel values */
    v->bitFlip = (GET_BLACK_PIXEL(v) != 0);
 }
@@ -1197,8 +1174,7 @@ static GLboolean initialize_visual_and_buffer( int client,
                                                XMesaBuffer b,
                                                GLboolean rgb_flag,
                                                XMesaDrawable window,
-                                               XMesaColormap cmap
-                                             )
+                                               XMesaColormap cmap )
 {
 #ifndef XFree86Server
    XGCValues gcvalues;
@@ -1209,7 +1185,7 @@ static GLboolean initialize_visual_and_buffer( int client,
    }
 
    /* Save true bits/pixel */
-   v->BitsPerPixel = GET_BITS_PER_PIXEL(v);
+   v->BitsPerPixel = bits_per_pixel(v);
    assert(v->BitsPerPixel > 0);
 
 
@@ -1218,39 +1194,38 @@ static GLboolean initialize_visual_and_buffer( int client,
        * Even if the visual is TrueColor or DirectColor we treat it as
        * being color indexed.  This is weird but might be useful to someone.
        */
-      v->dithered_pf = v->undithered_pf = PF_INDEX;
-      v->index_bits = GET_VISUAL_DEPTH(v);
+      v->dithered_pf = v->undithered_pf = PF_Index;
+      v->mesa_visual.indexBits = GET_VISUAL_DEPTH(v);
    }
    else {
       /* RGB WINDOW:
        * We support RGB rendering into almost any kind of visual.
        */
-      int xclass;
-      xclass = GET_VISUAL_CLASS(v);
-      if (xclass==TrueColor || xclass==DirectColor) {
+      const int xclass = v->mesa_visual.visualType;
+      if (xclass==GLX_TRUE_COLOR || xclass==GLX_DIRECT_COLOR) {
         setup_truecolor( v, b, cmap );
       }
-      else if (xclass==StaticGray && GET_VISUAL_DEPTH(v)==1) {
+      else if (xclass==GLX_STATIC_GRAY && GET_VISUAL_DEPTH(v)==1) {
         setup_monochrome( v, b );
       }
-      else if (xclass==GrayScale || xclass==StaticGray) {
+      else if (xclass==GLX_GRAY_SCALE || xclass==GLX_STATIC_GRAY) {
          if (!setup_grayscale( client, v, b, cmap )) {
             return GL_FALSE;
          }
       }
-      else if ((xclass==PseudoColor || xclass==StaticColor)
+      else if ((xclass==GLX_PSEUDO_COLOR || xclass==GLX_STATIC_COLOR)
                && GET_VISUAL_DEPTH(v)>=4 && GET_VISUAL_DEPTH(v)<=16) {
         if (!setup_dithered_color( client, v, b, cmap )) {
             return GL_FALSE;
          }
       }
       else {
-        error("XMesa: RGB mode rendering not supported in given visual.");
+        _mesa_warning(NULL, "XMesa: RGB mode rendering not supported in given visual.");
         return GL_FALSE;
       }
-      v->index_bits = 0;
+      v->mesa_visual.indexBits = 0;
 
-      if (getenv("MESA_NO_DITHER")) {
+      if (_mesa_getenv("MESA_NO_DITHER")) {
         v->dithered_pf = v->undithered_pf;
       }
    }
@@ -1261,13 +1236,13 @@ static GLboolean initialize_visual_and_buffer( int client,
     * which can help Brian figure out what's going on when a user
     * reports bugs.
     */
-   if (getenv("MESA_INFO")) {
-      fprintf(stderr, "X/Mesa visual = %p\n", (void *) v);
-      fprintf(stderr, "X/Mesa dithered pf = %u\n", v->dithered_pf);
-      fprintf(stderr, "X/Mesa undithered pf = %u\n", v->undithered_pf);
-      fprintf(stderr, "X/Mesa level = %d\n", v->level);
-      fprintf(stderr, "X/Mesa depth = %d\n", GET_VISUAL_DEPTH(v));
-      fprintf(stderr, "X/Mesa bits per pixel = %d\n", v->BitsPerPixel);
+   if (_mesa_getenv("MESA_INFO")) {
+      _mesa_printf("X/Mesa visual = %p\n", (void *) v);
+      _mesa_printf("X/Mesa dithered pf = %u\n", v->dithered_pf);
+      _mesa_printf("X/Mesa undithered pf = %u\n", v->undithered_pf);
+      _mesa_printf("X/Mesa level = %d\n", v->mesa_visual.level);
+      _mesa_printf("X/Mesa depth = %d\n", GET_VISUAL_DEPTH(v));
+      _mesa_printf("X/Mesa bits per pixel = %d\n", v->BitsPerPixel);
    }
 
    if (b && window) {
@@ -1366,6 +1341,8 @@ static GLboolean initialize_visual_and_buffer( int client,
                                   32,                   /*bitmap_pad*/
                                   0                     /*bytes_per_line*/ );
 #endif
+      if (!b->rowimage)
+         return GL_FALSE;
    }
 
    return GL_TRUE;
@@ -1381,9 +1358,9 @@ xmesa_color_to_pixel( XMesaContext xmesa, GLubyte r, GLubyte g, GLubyte b, GLuby
                       GLuint pixelFormat)
 {
    switch (pixelFormat) {
-      case PF_INDEX:
+      case PF_Index:
          return 0;
-      case PF_TRUECOLOR:
+      case PF_Truecolor:
          {
             unsigned long p;
             PACK_TRUECOLOR( p, r, g, b );
@@ -1397,26 +1374,26 @@ xmesa_color_to_pixel( XMesaContext xmesa, GLubyte r, GLubyte g, GLubyte b, GLuby
          return PACK_8R8G8B( r, g, b );
       case PF_5R6G5B:
          return PACK_5R6G5B( r, g, b );
-      case PF_DITHER:
+      case PF_Dither:
          {
             DITHER_SETUP;
             return DITHER( 1, 0, r, g, b );
          }
-      case PF_1BIT:
+      case PF_1Bit:
          /* 382 = (3*255)/2 */
          return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip;
       case PF_HPCR:
          return DITHER_HPCR(1, 1, r, g, b);
-      case PF_LOOKUP:
+      case PF_Lookup:
          {
             LOOKUP_SETUP;
             return LOOKUP( r, g, b );
          }
-      case PF_GRAYSCALE:
+      case PF_Grayscale:
          return GRAY_RGB( r, g, b );
-      case PF_TRUEDITHER:
+      case PF_Dither_True:
          /* fall through */
-      case PF_DITHER_5R6G5B:
+      case PF_Dither_5R6G5B:
          {
             unsigned long p;
             PACK_TRUEDITHER(p, 1, 0, r, g, b);
@@ -1429,6 +1406,34 @@ xmesa_color_to_pixel( XMesaContext xmesa, GLubyte r, GLubyte g, GLubyte b, GLuby
 }
 
 
+#define NUM_VISUAL_TYPES   6
+
+/**
+ * Convert an X visual type to a GLX visual type.
+ * 
+ * \param visualType X visual type (i.e., \c TrueColor, \c StaticGray, etc.)
+ *        to be converted.
+ * \return If \c visualType is a valid X visual type, a GLX visual type will
+ *         be returned.  Otherwise \c GLX_NONE will be returned.
+ * 
+ * \note
+ * This code was lifted directly from lib/GL/glx/glcontextmodes.c in the
+ * DRI CVS tree.
+ */
+static GLint
+xmesa_convert_from_x_visual_type( int visualType )
+{
+    static const int glx_visual_types[ NUM_VISUAL_TYPES ] = {
+       GLX_STATIC_GRAY,  GLX_GRAY_SCALE,
+       GLX_STATIC_COLOR, GLX_PSEUDO_COLOR,
+       GLX_TRUE_COLOR,   GLX_DIRECT_COLOR
+    };
+
+    return ( (unsigned) visualType < NUM_VISUAL_TYPES )
+       ? glx_visual_types[ visualType ] : GLX_NONE;
+}
+
+
 /**********************************************************************/
 /*****                       Public Functions                     *****/
 /**********************************************************************/
@@ -1454,7 +1459,7 @@ xmesa_color_to_pixel( XMesaContext xmesa, GLubyte r, GLubyte g, GLubyte b, GLuby
  *         accum_alpha_size - requested bits/alpha accum values, or zero
  *         num_samples - number of samples/pixel if multisampling, or zero
  *         level - visual level, usually 0
- *         visualCaveat - ala the GLX extension, usually GLX_NONE_EXT
+ *         visualCaveat - ala the GLX extension, usually GLX_NONE
  * Return;  a new XMesaVisual or 0 if error.
  */
 XMesaVisual XMesaCreateVisual( XMesaDisplay *display,
@@ -1479,7 +1484,7 @@ XMesaVisual XMesaCreateVisual( XMesaDisplay *display,
    GLint red_bits, green_bits, blue_bits, alpha_bits;
 
    /* For debugging only */
-   if (getenv("MESA_XSYNC")) {
+   if (_mesa_getenv("MESA_XSYNC")) {
       /* This makes debugging X easier.
        * In your debugger, set a breakpoint on _XError to stop when an
        * X protocol error is generated.
@@ -1507,37 +1512,17 @@ XMesaVisual XMesaCreateVisual( XMesaDisplay *display,
     * the struct but we may need some of the information contained in it
     * at a later time.
     */
-#ifdef XFree86Server
-   v->visinfo = visinfo;
-#else
+#ifndef XFree86Server
    v->visinfo = (XVisualInfo *) MALLOC(sizeof(*visinfo));
    if(!v->visinfo) {
       FREE(v);
       return NULL;
    }
    MEMCPY(v->visinfo, visinfo, sizeof(*visinfo));
-
-   /* Save a copy of the pointer now so we can find this visual again
-    * if we need to search for it in find_glx_visual().
-    */
-   v->vishandle = visinfo;
-#endif
-
-#ifdef XFree86Server
-   /* Initialize the depth of the screen */
-   {
-       PixmapFormatRec *format;
-
-       for (format = screenInfo.formats;
-           format->depth != display->rootDepth;
-           format++)
-          ;
-       v->screen_depth = format->bitsPerPixel;
-   }
 #endif
 
    /* check for MESA_GAMMA environment variable */
-   gamma = getenv("MESA_GAMMA");
+   gamma = _mesa_getenv("MESA_GAMMA");
    if (gamma) {
       v->RedGamma = v->GreenGamma = v->BlueGamma = 0.0;
       sscanf( gamma, "%f %f %f", &v->RedGamma, &v->GreenGamma, &v->BlueGamma );
@@ -1550,15 +1535,42 @@ XMesaVisual XMesaCreateVisual( XMesaDisplay *display,
    }
 
    v->ximage_flag = ximage_flag;
-   v->level = level;
-   v->VisualCaveat = visualCaveat;
+
+#ifdef XFree86Server
+   /* We could calculate these values by ourselves.  nplanes is either the sum
+    * of the red, green, and blue bits or the number index bits.
+    * ColormapEntries is either (1U << index_bits) or
+    * (1U << max(redBits, greenBits, blueBits)).
+    */
+   v->nplanes = visinfo->nplanes;
+   v->ColormapEntries = visinfo->ColormapEntries;
+
+   v->mesa_visual.redMask = visinfo->redMask;
+   v->mesa_visual.greenMask = visinfo->greenMask;
+   v->mesa_visual.blueMask = visinfo->blueMask;
+   v->mesa_visual.visualID = visinfo->vid;
+   v->mesa_visual.screen = 0; /* FIXME: What should be done here? */
+#else
+   v->mesa_visual.redMask = visinfo->red_mask;
+   v->mesa_visual.greenMask = visinfo->green_mask;
+   v->mesa_visual.blueMask = visinfo->blue_mask;
+   v->mesa_visual.visualID = visinfo->visualid;
+   v->mesa_visual.screen = visinfo->screen;
+#endif
+
+#if defined(XFree86Server) || !(defined(__cplusplus) || defined(c_plusplus))
+   v->mesa_visual.visualType = xmesa_convert_from_x_visual_type(visinfo->class);
+#else
+   v->mesa_visual.visualType = xmesa_convert_from_x_visual_type(visinfo->c_class);
+#endif
+
+   v->mesa_visual.visualRating = visualCaveat;
 
    (void) initialize_visual_and_buffer( 0, v, NULL, rgb_flag, 0, 0 );
 
    {
-      int xclass;
-      xclass = GET_VISUAL_CLASS(v);
-      if (xclass==TrueColor || xclass==DirectColor) {
+      const int xclass = v->mesa_visual.visualType;
+      if (xclass==GLX_TRUE_COLOR || xclass==GLX_DIRECT_COLOR) {
          red_bits   = bitcount(GET_REDMASK(v));
          green_bits = bitcount(GET_GREENMASK(v));
          blue_bits  = bitcount(GET_BLUEMASK(v));
@@ -1585,12 +1597,15 @@ XMesaVisual XMesaCreateVisual( XMesaDisplay *display,
                             rgb_flag, db_flag, stereo_flag,
                             red_bits, green_bits,
                             blue_bits, alpha_bits,
-                            v->index_bits,
+                            v->mesa_visual.indexBits,
                             depth_size,
                             stencil_size,
                             accum_red_size, accum_green_size,
                             accum_blue_size, accum_alpha_size,
                             0 );
+
+   /* XXX minor hack */
+   v->mesa_visual.level = level;
    return v;
 }
 
@@ -1611,96 +1626,101 @@ void XMesaDestroyVisual( XMesaVisual v )
 
 
 
-/*
+/**
  * Create a new XMesaContext.
- * Input:  v - XMesaVisual
- *         share_list - another XMesaContext with which to share display
- *                      lists or NULL if no sharing is wanted.
- * Return:  an XMesaContext or NULL if error.
+ * \param v  the XMesaVisual
+ * \param share_list  another XMesaContext with which to share display
+ *                    lists or NULL if no sharing is wanted.
+ * \return an XMesaContext or NULL if error.
  */
 XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list )
 {
-   XMesaContext c;
-   GLcontext *ctx;
-   GLboolean direct = GL_TRUE; /* XXXX */
-   /* NOT_DONE: should this be GL_FALSE??? */
    static GLboolean firstTime = GL_TRUE;
+   XMesaContext c;
+   GLcontext *mesaCtx;
+   struct dd_function_table functions;
+   TNLcontext *tnl;
 
    if (firstTime) {
       _glthread_INIT_MUTEX(_xmesa_lock);
       firstTime = GL_FALSE;
    }
 
+   /* Note: the XMesaContext contains a Mesa GLcontext struct (inheritance) */
    c = (XMesaContext) CALLOC_STRUCT(xmesa_context);
-   if (!c) {
+   if (!c)
       return NULL;
-   }
 
-   ctx = c->gl_ctx = _mesa_create_context( &v->mesa_visual,
-                      share_list ? share_list->gl_ctx : (GLcontext *) NULL,
-                      (void *) c, direct );
-   if (!c->gl_ctx) {
+   mesaCtx = &(c->mesa);
+
+   /* initialize with default driver functions, then plug in XMesa funcs */
+   _mesa_init_driver_functions(&functions);
+   xmesa_init_driver_functions(v, &functions);
+   if (!_mesa_initialize_context(mesaCtx, &v->mesa_visual,
+                      share_list ? &(share_list->mesa) : (GLcontext *) NULL,
+                      &functions, (void *) c)) {
       FREE(c);
       return NULL;
    }
 
-   _mesa_enable_sw_extensions(ctx);
-   _mesa_enable_1_3_extensions(ctx);
-
-   if (CHECK_BYTE_ORDER(v)) {
-      c->swapbytes = GL_FALSE;
-   }
-   else {
-      c->swapbytes = GL_TRUE;
-   }
+   _mesa_enable_sw_extensions(mesaCtx);
+   _mesa_enable_1_3_extensions(mesaCtx);
+   _mesa_enable_1_4_extensions(mesaCtx);
+   _mesa_enable_1_5_extensions(mesaCtx);
+   _mesa_enable_2_0_extensions(mesaCtx);
+#if SWTC
+    if (c->Mesa_DXTn) {
+       _mesa_enable_extension(c, "GL_EXT_texture_compression_s3tc");
+       _mesa_enable_extension(c, "GL_S3_s3tc");
+    }
+    _mesa_enable_extension(c, "GL_3DFX_texture_compression_FXT1");
+#endif
 
+   /* finish up xmesa context initializations */
+   c->swapbytes = CHECK_BYTE_ORDER(v) ? GL_FALSE : GL_TRUE;
    c->xm_visual = v;
+   c->xm_draw_buffer = NULL;   /* set later by XMesaMakeCurrent */
+   c->xm_read_buffer = NULL;   /* set later by XMesaMakeCurrent */
    c->xm_buffer = NULL;   /* set later by XMesaMakeCurrent */
    c->display = v->display;
    c->pixelformat = v->dithered_pf;      /* Dithering is enabled by default */
 
-   ctx->Driver.UpdateState = xmesa_update_state;
-
    /* Initialize the software rasterizer and helper modules.
     */
-   _swrast_CreateContext( ctx );
-   _ac_CreateContext( ctx );
-   _tnl_CreateContext( ctx );
-   _swsetup_CreateContext( ctx );
-
-   xmesa_register_swrast_functions( ctx );
-
-   /* Set up some constant pointers:
-    */
-   xmesa_init_pointers( ctx );
-
-
-   /* Run the config file
-    */
-   _mesa_read_config_file( ctx );
+   if (!_swrast_CreateContext( mesaCtx ) ||
+       !_ac_CreateContext( mesaCtx ) ||
+       !_tnl_CreateContext( mesaCtx ) ||
+       !_swsetup_CreateContext( mesaCtx )) {
+      _mesa_free_context_data(&c->mesa);
+      _mesa_free(c);
+      return NULL;
+   }
 
+   /* tnl setup */
+   tnl = TNL_CONTEXT(mesaCtx);
+   tnl->Driver.RunPipeline = _tnl_run_pipeline;
+   /* swrast setup */
+   xmesa_register_swrast_functions( mesaCtx );
+   _swsetup_Wakeup(mesaCtx);
 
    return c;
 }
 
 
 
-
 void XMesaDestroyContext( XMesaContext c )
 {
+   GLcontext *mesaCtx = &c->mesa;
 #ifdef FX
-   if (c->xm_buffer && c->xm_buffer->FXctx)
-      fxMesaDestroyContext(c->xm_buffer->FXctx);
+   if (c->xm_draw_buffer && c->xm_buffer->FXctx)
+      fxMesaDestroyContext(c->xm_draw_buffer->FXctx);
 #endif
-   if (c->gl_ctx) {
-      _swsetup_DestroyContext( c->gl_ctx );
-      _swrast_DestroyContext( c->gl_ctx );
-      _tnl_DestroyContext( c->gl_ctx );
-      _ac_DestroyContext( c->gl_ctx );
-      _mesa_destroy_context( c->gl_ctx );
-   }
-
-   FREE( c );
+   _swsetup_DestroyContext( mesaCtx );
+   _swrast_DestroyContext( mesaCtx );
+   _tnl_DestroyContext( mesaCtx );
+   _ac_DestroyContext( mesaCtx );
+   _mesa_free_context_data( mesaCtx );
+   _mesa_free( c );
 }
 
 
@@ -1744,14 +1764,12 @@ XMesaBuffer XMesaCreateWindowBuffer2( XMesaVisual v, XMesaWindow w,
 
    if (GET_VISUAL_DEPTH(v) != attr.depth) {
 #endif
-      if (getenv("MESA_DEBUG")) {
-         fprintf(stderr, "XMesaCreateWindowBuffer: depth mismatch between visual and window!\n");
-      }
+      _mesa_warning(NULL, "XMesaCreateWindowBuffer: depth mismatch between visual and window!\n");
       return NULL;
    }
 
    b->xm_visual = v;
-   b->pixmap_flag = GL_FALSE;
+   b->type = WINDOW;
    b->display = v->display;
 #ifdef XFree86Server
    b->cmap = (ColormapPtr)LookupIDByType(wColormap(w), RT_COLORMAP);
@@ -1760,9 +1778,7 @@ XMesaBuffer XMesaCreateWindowBuffer2( XMesaVisual v, XMesaWindow w,
       b->cmap = attr.colormap;
    }
    else {
-      if (getenv("MESA_DEBUG")) {
-         fprintf(stderr, "Window %u has no colormap!\n", (unsigned int) w);
-      }
+      _mesa_warning(NULL, "Window %u has no colormap!\n", (unsigned int) w);
       /* this is weird, a window w/out a colormap!? */
       /* OK, let's just allocate a new one and hope for the best */
       b->cmap = XCreateColormap(v->display, w, attr.visual, AllocNone);
@@ -1788,6 +1804,8 @@ XMesaBuffer XMesaCreateWindowBuffer2( XMesaVisual v, XMesaWindow w,
                                 v->mesa_visual.stencilBits > 0,
                                 v->mesa_visual.accumRedBits > 0,
                                 v->mesa_visual.alphaBits > 0 );
+   /* XXX hack */
+   b->mesa_buffer.UseSoftwareAuxBuffers = GL_TRUE;
 
    if (!initialize_visual_and_buffer( client, v, b, v->mesa_visual.rgbMode,
                                       (XMesaDrawable)w, b->cmap )) {
@@ -1796,7 +1814,7 @@ XMesaBuffer XMesaCreateWindowBuffer2( XMesaVisual v, XMesaWindow w,
    }
 
 #ifdef FX
-   fxEnvVar = getenv("MESA_GLX_FX");
+   fxEnvVar = _mesa_getenv("MESA_GLX_FX");
    if (fxEnvVar) {
      if (fxEnvVar[0]!='d') {
        int attribs[100];
@@ -1804,7 +1822,7 @@ XMesaBuffer XMesaCreateWindowBuffer2( XMesaVisual v, XMesaWindow w,
        int hw;
        if (v->mesa_visual.depthBits > 0) {
         attribs[numAttribs++] = FXMESA_DEPTH_SIZE;
-        attribs[numAttribs++] = 1;
+        attribs[numAttribs++] = v->mesa_visual.depthBits;
        }
        if (v->mesa_visual.doubleBufferMode) {
         attribs[numAttribs++] = FXMESA_DOUBLEBUFFER;
@@ -1819,23 +1837,27 @@ XMesaBuffer XMesaCreateWindowBuffer2( XMesaVisual v, XMesaWindow w,
        }
        if (v->mesa_visual.alphaBits > 0) {
          attribs[numAttribs++] = FXMESA_ALPHA_SIZE;
-         attribs[numAttribs++] = 1;
+         attribs[numAttribs++] = v->mesa_visual.alphaBits;
        }
-       if (c->gl_ctx) {
-#define FXMESA_SHARE_CONTEXT 990099  /* keep in sync with fxapi.c! */
+       if (1) {
          attribs[numAttribs++] = FXMESA_SHARE_CONTEXT;
-         attribs[numAttribs++] = (int) c->gl_ctx;
+         attribs[numAttribs++] = (int) &(c->mesa);
        }
        attribs[numAttribs++] = FXMESA_NONE;
 
-       if ((hw = fxQueryHardware())==GR_SSTTYPE_VOODOO) {
+       /* [dBorca] we should take an envvar for `fxMesaSelectCurrentBoard'!!! */
+       hw = fxMesaSelectCurrentBoard(0);
+       if ((hw == GR_SSTTYPE_VOODOO) || (hw == GR_SSTTYPE_Voodoo2)) {
          b->FXctx = fxMesaCreateBestContext(0, b->width, b->height, attribs);
-         if ((v->undithered_pf!=PF_INDEX) && (b->backimage)) {
+         if ((v->undithered_pf!=PF_Index) && (b->backimage)) {
           b->FXisHackUsable = b->FXctx ? GL_TRUE : GL_FALSE;
-          if (fxEnvVar[0]=='w' || fxEnvVar[0]=='W')
-            b->FXwindowHack = b->FXctx ? GL_TRUE : GL_FALSE;
-          else
+          if (b->FXctx && (fxEnvVar[0]=='w' || fxEnvVar[0]=='W')) {
+            b->FXwindowHack = GL_TRUE;
+            FX_grSstControl(GR_CONTROL_DEACTIVATE);
+          }
+           else {
             b->FXwindowHack = GL_FALSE;
+          }
          }
        }
        else {
@@ -1855,10 +1877,10 @@ XMesaBuffer XMesaCreateWindowBuffer2( XMesaVisual v, XMesaWindow w,
      }
    }
    else {
-      fprintf(stderr,"WARNING: This Mesa Library includes the Glide driver but\n");
-      fprintf(stderr,"         you have not defined the MESA_GLX_FX env. var.\n");
-      fprintf(stderr,"         (check the README.3DFX file for more information).\n\n");
-      fprintf(stderr,"         you can disable this message with a 'export MESA_GLX_FX=disable'.\n");
+      _mesa_warning(NULL, "WARNING: This Mesa Library includes the Glide driver but\n");
+      _mesa_warning(NULL, "         you have not defined the MESA_GLX_FX env. var.\n");
+      _mesa_warning(NULL, "         (check the README.3DFX file for more information).\n\n");
+      _mesa_warning(NULL, "         you can disable this message with a 'export MESA_GLX_FX=disable'.\n");
    }
 #endif
 
@@ -1872,13 +1894,14 @@ XMesaBuffer XMesaCreateWindowBuffer( XMesaVisual v, XMesaWindow w )
 }
 
 
-/*
+/**
  * Create a new XMesaBuffer from an X pixmap.
- * Input:  v - the XMesaVisual
- *         p - the pixmap
- *         cmap - the colormap, may be 0 if using a TrueColor or DirectColor
- *                visual for the pixmap
- * Return:  new XMesaBuffer or NULL if error
+ *
+ * \param v    the XMesaVisual
+ * \param p    the pixmap
+ * \param cmap the colormap, may be 0 if using a \c GLX_TRUE_COLOR or
+ *             \c GLX_DIRECT_COLOR visual for the pixmap
+ * \returns new XMesaBuffer or NULL if error
  */
 XMesaBuffer XMesaCreatePixmapBuffer( XMesaVisual v,
                                     XMesaPixmap p, XMesaColormap cmap )
@@ -1897,7 +1920,7 @@ XMesaBuffer XMesaCreatePixmapBuffer( XMesaVisual v,
    assert(v);
 
    b->xm_visual = v;
-   b->pixmap_flag = GL_TRUE;
+   b->type = PIXMAP;
    b->display = v->display;
    b->cmap = cmap;
 
@@ -1934,21 +1957,29 @@ XMesaBuffer XMesaCreatePixmapBuffer( XMesaVisual v,
 
 
 
-#if 0 /* not done */
 XMesaBuffer XMesaCreatePBuffer( XMesaVisual v, XMesaColormap cmap,
                                 unsigned int width, unsigned int height )
 {
+#ifdef XFree86Server
+   return 0;
+#else
    int client = 0;
+   XMesaWindow root;
+   XMesaDrawable drawable;  /* X Pixmap Drawable */
    XMesaBuffer b = alloc_xmesa_buffer();
    if (!b) {
       return NULL;
    }
 
    b->xm_visual = v;
-   b->pbuffer_flag = GL_TRUE;
+   b->type = PBUFFER;
    b->display = v->display;
    b->cmap = cmap;
 
+   /* allocate pixmap for front buffer */
+   root = RootWindow( v->display, v->visinfo->screen );
+   drawable = XCreatePixmap( v->display, root, width, height, v->visinfo->depth );
+
    /* determine back buffer implementation */
    if (v->mesa_visual.doubleBufferMode) {
       if (v->ximage_flag) {
@@ -1972,14 +2003,14 @@ XMesaBuffer XMesaCreatePBuffer( XMesaVisual v, XMesaColormap cmap,
                                 v->mesa_visual.alphaBits > 0 );
 
    if (!initialize_visual_and_buffer(client, v, b, v->mesa_visual.rgbMode,
-                                    0, cmap)) {
+                                    drawable, cmap)) {
       free_xmesa_buffer(client, b);
       return NULL;
    }
 
    return b;
-}
 #endif
+}
 
 
 
@@ -2052,34 +2083,34 @@ GLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer,
       if (drawBuffer->FXctx) {
          fxMesaMakeCurrent(drawBuffer->FXctx);
 
-         c->xm_buffer = drawBuffer;
+         c->xm_draw_buffer = drawBuffer;
          c->xm_read_buffer = readBuffer;
-         c->use_read_buffer = (drawBuffer != readBuffer);
+         c->xm_buffer = drawBuffer;
 
          return GL_TRUE;
       }
 #endif
-      if (c->gl_ctx == _mesa_get_current_context()
-          && c->xm_buffer == drawBuffer
+      if (&(c->mesa) == _mesa_get_current_context()
+          && c->xm_draw_buffer == drawBuffer
           && c->xm_read_buffer == readBuffer
-          && c->xm_buffer->wasCurrent) {
+          && c->xm_draw_buffer->wasCurrent) {
          /* same context and buffer, do nothing */
          return GL_TRUE;
       }
 
-      c->xm_buffer = drawBuffer;
+      c->xm_draw_buffer = drawBuffer;
       c->xm_read_buffer = readBuffer;
-      c->use_read_buffer = (drawBuffer != readBuffer);
+      c->xm_buffer = drawBuffer;
 
-      _mesa_make_current2(c->gl_ctx,
+      _mesa_make_current2(&(c->mesa),
                           &drawBuffer->mesa_buffer,
                           &readBuffer->mesa_buffer);
 
-      if (c->gl_ctx->Viewport.Width == 0) {
+      if (c->mesa.Viewport.Width == 0) {
         /* initialize viewport to window size */
         _mesa_Viewport( 0, 0, drawBuffer->width, drawBuffer->height );
-        c->gl_ctx->Scissor.Width = drawBuffer->width;
-        c->gl_ctx->Scissor.Height = drawBuffer->height;
+        c->mesa.Scissor.Width = drawBuffer->width;
+        c->mesa.Scissor.Height = drawBuffer->height;
       }
 
       if (c->xm_visual->mesa_visual.rgbMode) {
@@ -2093,11 +2124,11 @@ GLboolean XMesaMakeCurrent2( XMesaContext c, XMesaBuffer drawBuffer,
                                                c->clearcolor[2],
                                                c->clearcolor[3],
                                                c->xm_visual->undithered_pf);
-         XMesaSetForeground(c->display, c->xm_buffer->cleargc, c->clearpixel);
+         XMesaSetForeground(c->display, c->xm_draw_buffer->cleargc, c->clearpixel);
       }
 
       /* Solution to Stephane Rehel's problem with glXReleaseBuffersMESA(): */
-      c->xm_buffer->wasCurrent = GL_TRUE;
+      c->xm_draw_buffer->wasCurrent = GL_TRUE;
    }
    else {
       /* Detach */
@@ -2121,7 +2152,7 @@ XMesaContext XMesaGetCurrentContext( void )
 {
    GET_CURRENT_CONTEXT(ctx);
    if (ctx) {
-      XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
+      XMesaContext xmesa = XMESA_CONTEXT(ctx);
       return xmesa;
    }
    else {
@@ -2134,8 +2165,8 @@ XMesaBuffer XMesaGetCurrentBuffer( void )
 {
    GET_CURRENT_CONTEXT(ctx);
    if (ctx) {
-      XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
-      return xmesa->xm_buffer;
+      XMesaContext xmesa = XMESA_CONTEXT(ctx);
+      return xmesa->xm_draw_buffer;
    }
    else {
       return 0;
@@ -2148,8 +2179,8 @@ XMesaBuffer XMesaGetCurrentReadBuffer( void )
 {
    GET_CURRENT_CONTEXT(ctx);
    if (ctx) {
-      XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
-      return xmesa->xm_buffer;
+      XMesaContext xmesa = XMESA_CONTEXT(ctx);
+      return xmesa->xm_read_buffer;
    }
    else {
       return 0;
@@ -2160,8 +2191,8 @@ XMesaBuffer XMesaGetCurrentReadBuffer( void )
 GLboolean XMesaForceCurrent(XMesaContext c)
 {
    if (c) {
-      if (c->gl_ctx != _mesa_get_current_context()) {
-        _mesa_make_current(c->gl_ctx, &c->xm_buffer->mesa_buffer);
+      if (&(c->mesa) != _mesa_get_current_context()) {
+        _mesa_make_current(&(c->mesa), &c->xm_draw_buffer->mesa_buffer);
       }
    }
    else {
@@ -2185,7 +2216,7 @@ GLboolean XMesaLoseCurrent(XMesaContext c)
 GLboolean XMesaSetFXmode( GLint mode )
 {
 #ifdef FX
-   const char *fx = getenv("MESA_GLX_FX");
+   const char *fx = _mesa_getenv("MESA_GLX_FX");
    if (fx && fx[0] != 'd') {
       GET_CURRENT_CONTEXT(ctx);
       GrHwConfiguration hw;
@@ -2198,17 +2229,21 @@ GLboolean XMesaSetFXmode( GLint mode )
          return GL_FALSE;
       }
       if (ctx) {
-         XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
+         /* [dBorca] Hack alert: 
+         * oh, this is sooo wrong: ctx above is
+         * really an fxMesaContext, not an XMesaContext
+         */
+         XMesaContext xmesa = XMESA_CONTEXT(ctx);
          if (mode == XMESA_FX_WINDOW) {
-           if (xmesa->xm_buffer->FXisHackUsable) {
+           if (xmesa->xm_draw_buffer->FXisHackUsable) {
               FX_grSstControl(GR_CONTROL_DEACTIVATE);
-              xmesa->xm_buffer->FXwindowHack = GL_TRUE;
+              xmesa->xm_draw_buffer->FXwindowHack = GL_TRUE;
               return GL_TRUE;
            }
         }
         else if (mode == XMESA_FX_FULLSCREEN) {
            FX_grSstControl(GR_CONTROL_ACTIVATE);
-           xmesa->xm_buffer->FXwindowHack = GL_FALSE;
+           xmesa->xm_draw_buffer->FXwindowHack = GL_FALSE;
            return GL_TRUE;
         }
         else {
@@ -2237,9 +2272,7 @@ static void FXgetImage( XMesaBuffer b )
    int xpos, ypos;
    XMesaWindow root;
    unsigned int bw, depth, width, height;
-   XMesaContext xmesa = (XMesaContext) ctx->DriverCtx;
-
-   assert(xmesa->xm_buffer->FXctx);
+   XMesaContext xmesa = XMESA_CONTEXT(ctx);
 
 #ifdef XFree86Server
    x = b->frontbuffer->x;
@@ -2248,37 +2281,38 @@ static void FXgetImage( XMesaBuffer b )
    height = b->frontbuffer->height;
    depth = b->frontbuffer->depth;
 #else
-   XGetGeometry( xmesa->xm_visual->display, b->frontbuffer,
+   XGetGeometry( b->xm_visual->display, b->frontbuffer,
                  &root, &xpos, &ypos, &width, &height, &bw, &depth);
 #endif
    if (b->width != width || b->height != height) {
-      b->width = MIN2((int)width, xmesa->xm_buffer->FXctx->width);
-      b->height = MIN2((int)height, xmesa->xm_buffer->FXctx->height);
+      b->width = MIN2((int)width, b->FXctx->width);
+      b->height = MIN2((int)height, b->FXctx->height);
       if (b->width & 1)
          b->width--;  /* prevent odd width */
       xmesa_alloc_back_buffer( b );
    }
 
-   grLfbWriteColorFormat(GR_COLORFORMAT_ARGB);
-   if (xmesa->xm_visual->undithered_pf==PF_5R6G5B) {
+   /* [dBorca] we're always in the right GR_COLORFORMAT... aren't we? */
+   /* grLfbWriteColorFormat(GR_COLORFORMAT_ARGB); */
+   if (b->xm_visual->undithered_pf==PF_5R6G5B) {
       /* Special case: 16bpp RGB */
       grLfbReadRegion( GR_BUFFER_FRONTBUFFER,       /* src buffer */
-                       0, xmesa->xm_buffer->FXctx->height - b->height,  /*pos*/
+                       0, b->FXctx->height - b->height,  /*pos*/
                        b->width, b->height,         /* size */
                        b->width * sizeof(GLushort), /* stride */
                        b->backimage->data);         /* dest buffer */
    }
-   else if (xmesa->xm_visual->dithered_pf==PF_DITHER
-           && GET_VISUAL_DEPTH(xmesa->xm_visual)==8) {
+   else if (b->xm_visual->dithered_pf==PF_Dither
+           && GET_VISUAL_DEPTH(b->xm_visual)==8) {
       /* Special case: 8bpp RGB */
       for (y=0;y<b->height;y++) {
-         GLubyte *ptr = (GLubyte*) xmesa->xm_buffer->backimage->data
-                        + xmesa->xm_buffer->backimage->bytes_per_line * y;
+         GLubyte *ptr = (GLubyte*) b->backimage->data
+                        + b->backimage->bytes_per_line * y;
          XDITHER_SETUP(y);
 
          /* read row from 3Dfx frame buffer */
          grLfbReadRegion( GR_BUFFER_FRONTBUFFER,
-                          0, xmesa->xm_buffer->FXctx->height-(b->height-y),
+                          0, b->FXctx->height-(b->height-y),
                           b->width, 1,
                           0,
                           pixbuf );
@@ -2297,7 +2331,7 @@ static void FXgetImage( XMesaBuffer b )
       for (y=0;y<b->height;y++) {
          /* read row from 3Dfx frame buffer */
          grLfbReadRegion( GR_BUFFER_FRONTBUFFER,
-                          0, xmesa->xm_buffer->FXctx->height-(b->height-y),
+                          0, b->FXctx->height-(b->height-y),
                           b->width, 1,
                           0,
                           pixbuf );
@@ -2309,11 +2343,12 @@ static void FXgetImage( XMesaBuffer b )
                                               (pixbuf[x] & 0xf800) >> 8,
                                               (pixbuf[x] & 0x07e0) >> 3,
                                               (pixbuf[x] & 0x001f) << 3,
-                                              0xff, xmesa->pixelformat));
+                                              0xff,
+                                               b->xm_visual->undithered_pf));
          }
       }
    }
-   grLfbWriteColorFormat(GR_COLORFORMAT_ABGR);
+   /* grLfbWriteColorFormat(GR_COLORFORMAT_ABGR); */
 }
 #endif
 
@@ -2330,7 +2365,7 @@ void XMesaSwapBuffers( XMesaBuffer b )
     * we have to flush any pending rendering commands first.
     */
    if (ctx && ctx->DrawBuffer == &(b->mesa_buffer))
-      _mesa_swapbuffers(ctx);
+      _mesa_notifySwapBuffers(ctx);
 
    if (b->db_state) {
 #ifdef FX
@@ -2396,7 +2431,7 @@ void XMesaCopySubBuffer( XMesaBuffer b, int x, int y, int width, int height )
     * we have to flush any pending rendering commands first.
     */
    if (ctx && ctx->DrawBuffer == &(b->mesa_buffer))
-      _mesa_swapbuffers(ctx);
+      _mesa_notifySwapBuffers(ctx);
 
    if (b->db_state) {
       int yTop = b->height - y - height;
@@ -2515,7 +2550,7 @@ const char *XMesaGetString( XMesaContext c, int name )
 {
    (void) c;
    if (name==XMESA_VERSION) {
-      return "3.5";
+      return "5.0";
    }
    else if (name==XMESA_EXTENSIONS) {
       return "";
@@ -2549,7 +2584,7 @@ void XMesaGarbageCollect( void )
    XMesaBuffer b, next;
    for (b=XMesaBufferList; b; b=next) {
       next = b->Next;
-      if (b->display && b->frontbuffer && !b->pixmap_flag) {
+      if (b->display && b->frontbuffer && b->type == WINDOW) {
 #ifdef XFree86Server
         /* NOT_NEEDED */
 #else
@@ -2583,9 +2618,9 @@ unsigned long XMesaDitherColor( XMesaContext xmesa, GLint x, GLint y,
    GLint a = (GLint) (alpha * 255.0F);
 
    switch (xmesa->pixelformat) {
-      case PF_INDEX:
+      case PF_Index:
          return 0;
-      case PF_TRUECOLOR:
+      case PF_Truecolor:
          {
             unsigned long p;
             PACK_TRUECOLOR( p, r, g, b );
@@ -2597,26 +2632,26 @@ unsigned long XMesaDitherColor( XMesaContext xmesa, GLint x, GLint y,
          return PACK_8R8G8B( r, g, b );
       case PF_5R6G5B:
          return PACK_5R6G5B( r, g, b );
-      case PF_DITHER:
+      case PF_Dither:
          {
             DITHER_SETUP;
             return DITHER( x, y, r, g, b );
          }
-      case PF_1BIT:
+      case PF_1Bit:
          /* 382 = (3*255)/2 */
          return ((r+g+b) > 382) ^ xmesa->xm_visual->bitFlip;
       case PF_HPCR:
          return DITHER_HPCR(x, y, r, g, b);
-      case PF_LOOKUP:
+      case PF_Lookup:
          {
             LOOKUP_SETUP;
             return LOOKUP( r, g, b );
          }
-      case PF_GRAYSCALE:
+      case PF_Grayscale:
          return GRAY_RGB( r, g, b );
-      case PF_DITHER_5R6G5B:
+      case PF_Dither_5R6G5B:
          /* fall through */
-      case PF_TRUEDITHER:
+      case PF_Dither_True:
          {
             unsigned long p;
             PACK_TRUEDITHER(p, x, y, r, g, b);