Use the faster span read/write template for 16bpp
[mesa.git] / src / mesa / drivers / dos / dmesa.c
index 9ec0036176abedde56286e7248822092f7410b23..9688dd95b26fb772051d03580392618b8880b6bc 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * Mesa 3-D graphics library
- * Version:  5.0.1
+ * Version:  6.3
  * 
- * Copyright (C) 1999-2003  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"),
  */
 
 /*
- * DOS/DJGPP device driver v1.4 for Mesa
+ * DOS/DJGPP device driver v1.7 for Mesa
  *
- *  Copyright (c) 2003 - Borca Daniel
- *  Email : dborca@yahoo.com
+ *  Copyright (c) 2003 - Daniel Borca
+ *  Email : dborca@users.sourceforge.net
  *  Web   : http://www.geocities.com/dborca
  */
 
 
-#ifndef FX
 #include "glheader.h"
 #include "context.h"
+#include "imports.h"
+#ifndef FX
+#include "bufferobj.h"
+#include "buffers.h"
 #include "extensions.h"
 #include "macros.h"
 #include "matrix.h"
@@ -41,7 +44,6 @@
 #include "texformat.h"
 #include "teximage.h"
 #include "texstore.h"
-#include "imports.h"
 #include "array_cache/acache.h"
 #include "swrast/s_context.h"
 #include "swrast/s_depth.h"
 #include "tnl/tnl.h"
 #include "tnl/t_context.h"
 #include "tnl/t_pipeline.h"
-#ifndef MATROX
+#include "drivers/common/driverfuncs.h"
 #include "video.h"
-#else  /* MATROX */
-#include "mga/mga.h"
-#endif /* MATROX */
 #else  /* FX */
-#include "../glide/fxdrv.h"
+#include "GL/fxmesa.h"
 #endif /* FX */
 
 #include "GL/dmesa.h"
 
 
+#define SWTC 0 /* SW texture compression */
+
 
 /*
  * In C++ terms, this class derives from the GLvisual class.
  */
 struct dmesa_visual {
    GLvisual gl_visual;
-   GLboolean db_flag;           /* double buffered? */
-   GLboolean rgb_flag;          /* RGB mode? */
-   GLuint depth;                /* bits per pixel (1, 8, 24, etc) */
-#ifdef MATROX
-   int stride_in_pixels;
-#endif
-   int zbuffer;                 /* Z=buffer: 0=no, 1=SW, -1=HW */
+   GLboolean sw_alpha;          /* use Mesa's alpha buffer? */
+   int z_buffer;                /* Z=buffer: 0=no, 1=SW, -1=HW */
 };
 
 /*
@@ -99,467 +95,351 @@ struct dmesa_buffer {
 struct dmesa_context {
    GLcontext gl_ctx;            /* the core library context */
    DMesaVisual visual;
-   DMesaBuffer Buffer;
+   DMesaBuffer buffer;
    GLuint ClearColor;
    GLuint ClearIndex;
    /* etc... */
 };
 
 
-
 #ifndef FX
 /****************************************************************************
  * Read/Write pixels
  ***************************************************************************/
-#define FLIP(y)  (dmesa->Buffer->height - (y) - 1)
+#define FLIP(y)  (dmesa->buffer->height - (y) - 1)
 #define FLIP2(y) (_b_ - (y))
 
-
-#ifndef MATROX
-#define DSTRIDE dmesa->Buffer->width
-#else
-#define DSTRIDE dmesa->visual->stride_in_pixels
-#define vl_putpixel mga_putpixel
-#define vl_mixrgba  mga_mixrgb
-#define vl_mixrgb   mga_mixrgb
-#define vl_getrgba  mga_getrgba
-#define vl_setz     mga_setz
-#define vl_getz     mga_getz
-#endif
+#define DSTRIDE dmesa->buffer->width
 
 /****************************************************************************
  * RGB[A]
  ***************************************************************************/
-static void write_rgba_span (const GLcontext *ctx, GLuint n, GLint x, GLint y,
-                             const GLubyte rgba[][4], const GLubyte mask[])
+static void
+write_rgba_span (const GLcontext *ctx, GLuint n, GLint x, GLint y,
+                 const GLubyte rgba[][4], const GLubyte mask[])
 {
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint i, offset;
-
-#ifndef MATROX
- offset = DSTRIDE * FLIP(y) + x;
- if (mask) {
-    /* draw some pixels */
-    for (i=0; i<n; i++, offset++) {
-        if (mask[i]) {
-           vl_putpixel(offset, vl_mixrgba(rgba[i]));
-        }
-    }
- } else {
-    /* draw all pixels */
-    for (i=0; i<n; i++, offset++) {
-        vl_putpixel(offset, vl_mixrgba(rgba[i]));
-    }
- }
-#else  /* MATROX */
- y = FLIP(y);
- if (mask) {
-    /* draw some pixels */
-    offset = 0;
-    for (i = 0; i < n; i++) {
-        if (mask[i]) {
-           ++offset;
-        } else {
-           if (offset != 0) {
-              mga_draw_span_rgb_tx32(x + i - offset, y, offset, (const unsigned long *)(&rgba[i-offset]));
-              offset = 0;
-           }
-        }
-    }
-    if (offset != 0) {
-       mga_draw_span_rgb_tx32(x + n - offset, y, offset, (const unsigned long *)(&rgba[n-offset]));
-    }
- } else {
-    /* draw all pixels */
-    mga_draw_span_rgb_tx32(x, y, n, (const unsigned long *)rgba);
- }
-#endif /* MATROX */
+   const DMesaContext dmesa = (DMesaContext)ctx;
+   GLuint i, offset;
+
+   offset = DSTRIDE * FLIP(y) + x;
+   if (mask) {
+      /* draw some pixels */
+      for (i = 0; i < n; i++, offset++) {
+         if (mask[i]) {
+            vl_putpixel(offset, vl_mixrgba(rgba[i]));
+         }
+      }
+   } else {
+      /* draw all pixels */
+      for (i = 0; i < n; i++, offset++) {
+         vl_putpixel(offset, vl_mixrgba(rgba[i]));
+      }
+   }
 }
 
 
-
-static void write_rgb_span (const GLcontext *ctx, GLuint n, GLint x, GLint y,
-                            const GLubyte rgb[][3], const GLubyte mask[])
+static void
+write_rgb_span (const GLcontext *ctx, GLuint n, GLint x, GLint y,
+                const GLubyte rgb[][3], const GLubyte mask[])
 {
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint i, offset;
-
- offset = DSTRIDE * FLIP(y) + x;
- if (mask) {
-    /* draw some pixels */
-    for (i=0; i<n; i++, offset++) {
-        if (mask[i]) {
-           vl_putpixel(offset, vl_mixrgb(rgb[i]));
-        }
-    }
- } else {
-    /* draw all pixels */
-    for (i=0; i<n; i++, offset++) {
-        vl_putpixel(offset, vl_mixrgb(rgb[i]));
-    }
- }
  const DMesaContext dmesa = (DMesaContext)ctx;
  GLuint i, offset;
+
  offset = DSTRIDE * FLIP(y) + x;
  if (mask) {
+      /* draw some pixels */
+      for (i = 0; i < n; i++, offset++) {
+         if (mask[i]) {
+            vl_putpixel(offset, vl_mixrgb(rgb[i]));
+         }
+      }
  } else {
+      /* draw all pixels */
+      for (i = 0; i < n; i++, offset++) {
+         vl_putpixel(offset, vl_mixrgb(rgb[i]));
+      }
  }
 }
 
 
-
-static void write_mono_rgba_span (const GLcontext *ctx,
-                                  GLuint n, GLint x, GLint y,
-                                  const GLchan color[4], const GLubyte mask[])
+static void
+write_mono_rgba_span (const GLcontext *ctx,
+                      GLuint n, GLint x, GLint y,
+                      const GLchan color[4], const GLubyte mask[])
 {
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint i, offset, rgba = vl_mixrgba(color);
-
- offset = DSTRIDE * FLIP(y) + x;
- if (mask) {
-    /* draw some pixels */
-    for (i=0; i<n; i++, offset++) {
-        if (mask[i]) {
-           vl_putpixel(offset, rgba);
-        }
-    }
- } else {
-    /* draw all pixels */
-    for (i=0; i<n; i++, offset++) {
-        vl_putpixel(offset, rgba);
-    }
- }
  const DMesaContext dmesa = (DMesaContext)ctx;
  GLuint i, offset, rgba = vl_mixrgba(color);
+
  offset = DSTRIDE * FLIP(y) + x;
  if (mask) {
+      /* draw some pixels */
+      for (i = 0; i < n; i++, offset++) {
+         if (mask[i]) {
+            vl_putpixel(offset, rgba);
+         }
+      }
  } else {
+      /* draw all pixels */
+      for (i = 0; i < n; i++, offset++) {
+         vl_putpixel(offset, rgba);
+      }
  }
 }
 
 
-
-static void read_rgba_span (const GLcontext *ctx, GLuint n, GLint x, GLint y,
-                            GLubyte rgba[][4])
+static void
+read_rgba_span (const GLcontext *ctx, GLuint n, GLint x, GLint y,
+                GLubyte rgba[][4])
 {
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint i, offset;
-
- offset = DSTRIDE * FLIP(y) + x;
- /* read all pixels */
for (i=0; i<n; i++, offset++) {
-     vl_getrgba(offset, rgba[i]);
- }
  const DMesaContext dmesa = (DMesaContext)ctx;
  GLuint i, offset;
+
  offset = DSTRIDE * FLIP(y) + x;
  /* read all pixels */
  for (i = 0; i < n; i++, offset++) {
+      vl_getrgba(offset, rgba[i]);
  }
 }
 
 
-
-static void write_rgba_pixels (const GLcontext *ctx,
-                               GLuint n, const GLint x[], const GLint y[],
-                               const GLubyte rgba[][4], const GLubyte mask[])
+static void
+write_rgba_pixels (const GLcontext *ctx,
+                   GLuint n, const GLint x[], const GLint y[],
+                   const GLubyte rgba[][4], const GLubyte mask[])
 {
- const DMesaContext dmesa = (DMesaContext)ctx;
GLuint i, _w_ = DSTRIDE, _b_ = dmesa->Buffer->height - 1;
-
- if (mask) {
-    /* draw some pixels */
-    for (i=0; i<n; i++) {
-        if (mask[i]) {
-           vl_putpixel(FLIP2(y[i])*_w_ + x[i], vl_mixrgba(rgba[i]));
-        }
-    }
- } else {
-    /* draw all pixels */
-    for (i=0; i<n; i++) {
-        vl_putpixel(FLIP2(y[i])*_w_ + x[i], vl_mixrgba(rgba[i]));
-    }
- }
  const DMesaContext dmesa = (DMesaContext)ctx;
  GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1;
+
  if (mask) {
+      /* draw some pixels */
+      for (i = 0; i < n; i++) {
+         if (mask[i]) {
+            vl_putpixel(FLIP2(y[i])*_w_ + x[i], vl_mixrgba(rgba[i]));
+         }
+      }
  } else {
+      /* draw all pixels */
+      for (i = 0; i < n; i++) {
+         vl_putpixel(FLIP2(y[i])*_w_ + x[i], vl_mixrgba(rgba[i]));
+      }
  }
 }
 
 
-
-static void write_mono_rgba_pixels (const GLcontext *ctx,
-                                    GLuint n, const GLint x[], const GLint y[],
+static void
+write_mono_rgba_pixels (const GLcontext *ctx,
+                        GLuint n, const GLint x[], const GLint y[],
                                     const GLchan color[4], const GLubyte mask[])
 {
- const DMesaContext dmesa = (DMesaContext)ctx;
GLuint i, _w_ = DSTRIDE, _b_ = dmesa->Buffer->height - 1, rgba = vl_mixrgba(color);
-
- if (mask) {
-    /* draw some pixels */
-    for (i=0; i<n; i++) {
-        if (mask[i]) {
-           vl_putpixel(FLIP2(y[i])*_w_ + x[i], rgba);
-        }
-    }
- } else {
-    /* draw all pixels */
-    for (i=0; i<n; i++) {
-        vl_putpixel(FLIP2(y[i])*_w_ + x[i], rgba);
-    }
- }
  const DMesaContext dmesa = (DMesaContext)ctx;
  GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1, rgba = vl_mixrgba(color);
+
  if (mask) {
+      /* draw some pixels */
+      for (i = 0; i < n; i++) {
+         if (mask[i]) {
+            vl_putpixel(FLIP2(y[i])*_w_ + x[i], rgba);
+         }
+      }
  } else {
+      /* draw all pixels */
+      for (i = 0; i < n; i++) {
+         vl_putpixel(FLIP2(y[i])*_w_ + x[i], rgba);
+      }
  }
 }
 
 
-
-static void read_rgba_pixels (const GLcontext *ctx,
-                              GLuint n, const GLint x[], const GLint y[],
-                              GLubyte rgba[][4], const GLubyte mask[])
+static void
+read_rgba_pixels (const GLcontext *ctx,
+                  GLuint n, const GLint x[], const GLint y[],
+                  GLubyte rgba[][4], const GLubyte mask[])
 {
- const DMesaContext dmesa = (DMesaContext)ctx;
GLuint i, _w_ = DSTRIDE, _b_ = dmesa->Buffer->height - 1;
-
- if (mask) {
-    /* read some pixels */
-    for (i=0; i<n; i++) {
-        if (mask[i]) {
-           vl_getrgba(FLIP2(y[i])*_w_ + x[i], rgba[i]);
-        }
-    }
- } else {
-    /* read all pixels */
-    for (i=0; i<n; i++) {
-        vl_getrgba(FLIP2(y[i])*_w_ + x[i], rgba[i]);
-    }
- }
  const DMesaContext dmesa = (DMesaContext)ctx;
  GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1;
+
  if (mask) {
+      /* read some pixels */
+      for (i = 0; i < n; i++) {
+         if (mask[i]) {
+            vl_getrgba(FLIP2(y[i])*_w_ + x[i], rgba[i]);
+         }
+      }
  } else {
+      /* read all pixels */
+      for (i = 0; i < n; i++) {
+         vl_getrgba(FLIP2(y[i])*_w_ + x[i], rgba[i]);
+      }
  }
 }
 
 
-
 /****************************************************************************
  * Index
  ***************************************************************************/
-#ifndef MATROX
-static void write_index_span (const GLcontext *ctx, GLuint n, GLint x, GLint y,
-                              const GLuint index[], const GLubyte mask[])
+static void
+write_index_span (const GLcontext *ctx, GLuint n, GLint x, GLint y,
+                  const GLuint index[], const GLubyte mask[])
 {
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint i, offset;
-
- offset = DSTRIDE * FLIP(y) + x;
- if (mask) {
-    /* draw some pixels */
-    for (i=0; i<n; i++, offset++) {
-        if (mask[i]) {
-           vl_putpixel(offset, index[i]);
-        }
-    }
- } else {
-    /* draw all pixels */
-    for (i=0; i<n; i++, offset++) {
-        vl_putpixel(offset, index[i]);
-    }
- }
  const DMesaContext dmesa = (DMesaContext)ctx;
  GLuint i, offset;
+
  offset = DSTRIDE * FLIP(y) + x;
  if (mask) {
+      /* draw some pixels */
+      for (i = 0; i < n; i++, offset++) {
+         if (mask[i]) {
+            vl_putpixel(offset, index[i]);
+         }
+      }
  } else {
+      /* draw all pixels */
+      for (i = 0; i < n; i++, offset++) {
+         vl_putpixel(offset, index[i]);
+      }
  }
 }
 
 
-
-static void write_index8_span (const GLcontext *ctx, GLuint n, GLint x, GLint y,
-                               const GLubyte index[], const GLubyte mask[])
+static void
+write_index8_span (const GLcontext *ctx, GLuint n, GLint x, GLint y,
+                   const GLubyte index[], const GLubyte mask[])
 {
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint i, offset;
-
- offset = DSTRIDE * FLIP(y) + x;
- if (mask) {
-    /* draw some pixels */
-    for (i=0; i<n; i++, offset++) {
-        if (mask[i]) {
-           vl_putpixel(offset, index[i]);
-        }
-    }
- } else {
-    /* draw all pixels */
-    for (i=0; i<n; i++, offset++) {
-        vl_putpixel(offset, index[i]);
-    }
- }
  const DMesaContext dmesa = (DMesaContext)ctx;
  GLuint i, offset;
+
  offset = DSTRIDE * FLIP(y) + x;
  if (mask) {
+      /* draw some pixels */
+      for (i = 0; i < n; i++, offset++) {
+         if (mask[i]) {
+            vl_putpixel(offset, index[i]);
+         }
+      }
  } else {
+      /* draw all pixels */
+      for (i = 0; i < n; i++, offset++) {
+         vl_putpixel(offset, index[i]);
+      }
  }
 }
 
 
-
-static void write_mono_index_span (const GLcontext *ctx,
-                                   GLuint n, GLint x, GLint y,
-                                   GLuint colorIndex, const GLubyte mask[])
+static void
+write_mono_index_span (const GLcontext *ctx,
+                       GLuint n, GLint x, GLint y,
+                       GLuint colorIndex, const GLubyte mask[])
 {
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint i, offset;
-
- offset = DSTRIDE * FLIP(y) + x;
- if (mask) {
-    /* draw some pixels */
-    for (i=0; i<n; i++, offset++) {
-        if (mask[i]) {
-           vl_putpixel(offset, colorIndex);
-        }
-    }
- } else {
-    /* draw all pixels */
-    for (i=0; i<n; i++, offset++) {
-        vl_putpixel(offset, colorIndex);
-    }
- }
  const DMesaContext dmesa = (DMesaContext)ctx;
  GLuint i, offset;
+
  offset = DSTRIDE * FLIP(y) + x;
  if (mask) {
+      /* draw some pixels */
+      for (i = 0; i < n; i++, offset++) {
+         if (mask[i]) {
+            vl_putpixel(offset, colorIndex);
+         }
+      }
  } else {
+      /* draw all pixels */
+      for (i = 0; i < n; i++, offset++) {
+         vl_putpixel(offset, colorIndex);
+      }
  }
 }
 
 
-
-static void read_index_span (const GLcontext *ctx, GLuint n, GLint x, GLint y,
-                             GLuint index[])
+static void
+read_index_span (const GLcontext *ctx, GLuint n, GLint x, GLint y,
+                 GLuint index[])
 {
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint i, offset;
-
- offset = DSTRIDE * FLIP(y) + x;
- /* read all pixels */
for (i=0; i<n; i++, offset++) {
-     index[i] = vl_getpixel(offset);
- }
  const DMesaContext dmesa = (DMesaContext)ctx;
  GLuint i, offset;
+
  offset = DSTRIDE * FLIP(y) + x;
  /* read all pixels */
  for (i = 0; i < n; i++, offset++) {
+      index[i] = vl_getpixel(offset);
  }
 }
 
 
-
-static void write_index_pixels (const GLcontext *ctx,
-                                GLuint n, const GLint x[], const GLint y[],
-                                const GLuint index[], const GLubyte mask[])
+static void
+write_index_pixels (const GLcontext *ctx,
+                    GLuint n, const GLint x[], const GLint y[],
+                    const GLuint index[], const GLubyte mask[])
 {
- const DMesaContext dmesa = (DMesaContext)ctx;
GLuint i, _w_ = DSTRIDE, _b_ = dmesa->Buffer->height - 1;
-
- if (mask) {
-    /* draw some pixels */
-    for (i=0; i<n; i++) {
-        if (mask[i]) {
-           vl_putpixel(FLIP2(y[i])*_w_ + x[i], index[i]);
-        }
-    }
- } else {
-    /* draw all pixels */
-    for (i=0; i<n; i++) {
-        vl_putpixel(FLIP2(y[i])*_w_ + x[i], index[i]);
-    }
- }
  const DMesaContext dmesa = (DMesaContext)ctx;
  GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1;
+
  if (mask) {
+      /* draw some pixels */
+      for (i = 0; i < n; i++) {
+         if (mask[i]) {
+            vl_putpixel(FLIP2(y[i])*_w_ + x[i], index[i]);
+         }
+      }
  } else {
+      /* draw all pixels */
+      for (i = 0; i < n; i++) {
+         vl_putpixel(FLIP2(y[i])*_w_ + x[i], index[i]);
+      }
  }
 }
 
 
-
-static void write_mono_index_pixels (const GLcontext *ctx,
-                                     GLuint n, const GLint x[], const GLint y[],
-                                     GLuint colorIndex, const GLubyte mask[])
+static void
+write_mono_index_pixels (const GLcontext *ctx,
+                         GLuint n, const GLint x[], const GLint y[],
+                         GLuint colorIndex, const GLubyte mask[])
 {
- const DMesaContext dmesa = (DMesaContext)ctx;
GLuint i, _w_ = DSTRIDE, _b_ = dmesa->Buffer->height - 1;
-
- if (mask) {
-    /* draw some pixels */
-    for (i=0; i<n; i++) {
-        if (mask[i]) {
-           vl_putpixel(FLIP2(y[i])*_w_ + x[i], colorIndex);
-        }
-    }
- } else {
-    /* draw all pixels */
-    for (i=0; i<n; i++) {
-        vl_putpixel(FLIP2(y[i])*_w_ + x[i], colorIndex);
-    }
- }
  const DMesaContext dmesa = (DMesaContext)ctx;
  GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1;
+
  if (mask) {
+      /* draw some pixels */
+      for (i = 0; i < n; i++) {
+         if (mask[i]) {
+            vl_putpixel(FLIP2(y[i])*_w_ + x[i], colorIndex);
+         }
+      }
  } else {
+      /* draw all pixels */
+      for (i = 0; i < n; i++) {
+         vl_putpixel(FLIP2(y[i])*_w_ + x[i], colorIndex);
+      }
  }
 }
 
 
-
-static void read_index_pixels (const GLcontext *ctx,
-                               GLuint n, const GLint x[], const GLint y[],
+static void
+read_index_pixels (const GLcontext *ctx,
+                   GLuint n, const GLint x[], const GLint y[],
                                GLuint index[], const GLubyte mask[])
 {
- const DMesaContext dmesa = (DMesaContext)ctx;
GLuint i, _w_ = DSTRIDE, _b_ = dmesa->Buffer->height - 1;
-
- if (mask) {
-    /* read some pixels */
-    for (i=0; i<n; i++) {
-        if (mask[i]) {
-           index[i] = vl_getpixel(FLIP2(y[i])*_w_ + x[i]);
-        }
-    }
- } else {
-    /* read all pixels */
-    for (i=0; i<n; i++) {
-        index[i] = vl_getpixel(FLIP2(y[i])*_w_ + x[i]);
-    }
- }
  const DMesaContext dmesa = (DMesaContext)ctx;
  GLuint i, _w_ = DSTRIDE, _b_ = dmesa->buffer->height - 1;
+
  if (mask) {
+      /* read some pixels */
+      for (i = 0; i < n; i++) {
+         if (mask[i]) {
+            index[i] = vl_getpixel(FLIP2(y[i])*_w_ + x[i]);
+         }
+      }
  } else {
+      /* read all pixels */
+      for (i = 0; i < n; i++) {
+         index[i] = vl_getpixel(FLIP2(y[i])*_w_ + x[i]);
+      }
  }
 }
-#endif /* !MATROX */
-
 
 
 /****************************************************************************
  * Z-buffer
  ***************************************************************************/
-#ifdef MATROX
-static void write_depth_span (GLcontext *ctx, GLuint n, GLint x, GLint y,
-                              const GLdepth depth[], const GLubyte mask[])
-{
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint i, offset;
-
- offset = DSTRIDE * FLIP(y) + x;
- if (mask) {
-    /* draw some values */
-    for (i=0; i<n; i++, offset++) {
-        if (mask[i]) {
-           vl_setz(offset, depth[i]);
-        }
-    }
- } else {
-    /* draw all values */
-    for (i=0; i<n; i++, offset++) {
-        vl_setz(offset, depth[i]);
-    }
- }
-}
-
-
-
-static void read_depth_span (GLcontext *ctx, GLuint n, GLint x, GLint y,
-                             GLdepth depth[])
-{
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint i, offset;
-
- offset = DSTRIDE * FLIP(y) + x;
- /* read all values */
- for (i=0; i<n; i++, offset++) {
-     depth[i] = vl_getz(offset);
- }
-}
-
-
-
-static void write_depth_pixels (GLcontext *ctx, GLuint n,
-                                const GLint x[], const GLint y[],
-                                const GLdepth depth[], const GLubyte mask[])
-{
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint i, _w_ = DSTRIDE, _b_ = dmesa->Buffer->height - 1;
-
- if (mask) {
-    /* draw some values */
-    for (i=0; i<n; i++) {
-        if (mask[i]) {
-           vl_setz(FLIP2(y[i])*_w_ + x[i], depth[i]);
-        }
-    }
- } else {
-    /* draw all values */
-    for (i=0; i<n; i++) {
-        vl_setz(FLIP2(y[i])*_w_ + x[i], depth[i]);
-    }
- }
-}
-
-
-
-static void read_depth_pixels (GLcontext *ctx, GLuint n,
-                               const GLint x[], const GLint y[],
-                               GLdepth depth[])
-{
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint i, _w_ = DSTRIDE, _b_ = dmesa->Buffer->height - 1;
-
- /* read all values */
- for (i=0; i<n; i++) {
-     depth[i] = vl_getz(FLIP2(y[i])*_w_ + x[i]);
- }
-}
-#endif /* MATROX */
-
 
 
 /****************************************************************************
@@ -569,157 +449,78 @@ static void read_depth_pixels (GLcontext *ctx, GLuint n,
 /*
  * NON-depth-buffered flat triangle.
  */
-#ifndef MATROX
-
 #define NAME tri_rgb_flat
 
 #define SETUP_CODE \
const DMesaContext dmesa = (DMesaContext)ctx; \
GLuint _b_ = dmesa->Buffer->height - 1; \
GLuint _w_ = dmesa->Buffer->width; \
- GLuint rgb = vl_mixrgb(v2->color);
  const DMesaContext dmesa = (DMesaContext)ctx;\
  GLuint _b_ = dmesa->buffer->height - 1;     \
  GLuint _w_ = dmesa->buffer->width;          \
  GLuint rgb = vl_mixrgb(v2->color);
 
 #define RENDER_SPAN(span) \
GLuint i, offset = FLIP2(span.y)*_w_ + span.x;        \
for (i = 0; i < span.end; i++, offset++) {    \
-     vl_putpixel(offset, rgb);                 \
- }
  GLuint i, offset = FLIP2(span.y)*_w_ + span.x;\
  for (i = 0; i < span.end; i++, offset++) {  \
+      vl_putpixel(offset, rgb);                        \
  }
 
 #include "swrast/s_tritemp.h"
 
-#else  /* MATROX */
-
-static void tri_rgb_flat (GLcontext *ctx,
-                          const SWvertex *v0,
-                          const SWvertex *v1,
-                          const SWvertex *v2)
-{
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint _b_ = dmesa->Buffer->height - 1;
- MGAvertex m0, m1, m2;
- m0.win[0] = v0->win[0];
- m0.win[1] = FLIP2(v0->win[1]);
- m1.win[0] = v1->win[0];
- m1.win[1] = FLIP2(v1->win[1]);
- m2.win[0] = v2->win[0];
- m2.win[1] = FLIP2(v2->win[1]);
- *(unsigned long *)m2.color = *(unsigned long *)v2->color;
- mga_draw_tri_rgb_flat((int)SWRAST_CONTEXT(ctx)->_backface_sign, &m0, &m1, &m2);
-}
-#endif /* MATROX */
-
-
 
 /*
  * Z-less flat triangle.
  */
-#ifndef MATROX
-
 #define NAME tri_rgb_flat_zless
 
 #define INTERP_Z 1
 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
 
 #define SETUP_CODE \
- const DMesaContext dmesa = (DMesaContext)ctx; \
GLuint _b_ = dmesa->Buffer->height - 1; \
GLuint _w_ = dmesa->Buffer->width; \
- GLuint rgb = vl_mixrgb(v2->color);
  const DMesaContext dmesa = (DMesaContext)ctx; \
  GLuint _b_ = dmesa->buffer->height - 1;     \
  GLuint _w_ = dmesa->buffer->width;          \
  GLuint rgb = vl_mixrgb(v2->color);
 
 #define RENDER_SPAN(span) \
GLuint i, offset = FLIP2(span.y)*_w_ + span.x;        \
for (i = 0; i < span.end; i++, offset++) {    \
-     const DEPTH_TYPE z = FixedToDepth(span.z);        \
-     if (z < zRow[i]) {                                \
-        vl_putpixel(offset, rgb);              \
-        zRow[i] = z;                           \
-     }                                         \
-     span.z += span.zStep;                     \
- }
  GLuint i, offset = FLIP2(span.y)*_w_ + span.x;\
  for (i = 0; i < span.end; i++, offset++) {  \
+      const DEPTH_TYPE z = FixedToDepth(span.z);\
+      if (z < zRow[i]) {                       \
+         vl_putpixel(offset, rgb);             \
+         zRow[i] = z;                          \
+      }                                                \
+      span.z += span.zStep;                    \
  }
 
 #include "swrast/s_tritemp.h"
 
-#else  /* MATROX */
-
-static void tri_rgb_flat_zless (GLcontext *ctx,
-                                const SWvertex *v0,
-                                const SWvertex *v1,
-                                const SWvertex *v2)
-{
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint _b_ = dmesa->Buffer->height - 1;
- MGAvertex m0, m1, m2;
- m0.win[0] = v0->win[0];
- m0.win[1] = FLIP2(v0->win[1]);
- m0.win[2] = v0->win[2];
- m1.win[0] = v1->win[0];
- m1.win[1] = FLIP2(v1->win[1]);
- m1.win[2] = v1->win[2];
- m2.win[0] = v2->win[0];
- m2.win[1] = FLIP2(v2->win[1]);
- m2.win[2] = v2->win[2];
- *(unsigned long *)m2.color = *(unsigned long *)v2->color;
- mga_draw_tri_rgb_flat_zless((int)SWRAST_CONTEXT(ctx)->_backface_sign, &m0, &m1, &m2);
-}
-#endif /* MATROX */
-
-
 
 /*
  * NON-depth-buffered iterated triangle.
  */
-#ifndef MATROX
-
 #define NAME tri_rgb_iter
 
 #define INTERP_RGB 1
 
 #define SETUP_CODE \
const DMesaContext dmesa = (DMesaContext)ctx; \
GLuint _b_ = dmesa->Buffer->height - 1; \
GLuint _w_ = dmesa->Buffer->width;
  const DMesaContext dmesa = (DMesaContext)ctx;\
  GLuint _b_ = dmesa->buffer->height - 1;     \
  GLuint _w_ = dmesa->buffer->width;
 
 #define RENDER_SPAN(span) \
GLuint i, offset = FLIP2(span.y)*_w_ + span.x;                                \
for (i = 0; i < span.end; i++, offset++) {                            \
-     vl_putpixel(offset, vl_mixfix(span.red, span.green, span.blue));  \
-     span.red += span.redStep;                                         \
-     span.green += span.greenStep;                                     \
-     span.blue += span.blueStep;                                       \
- }
  GLuint i, offset = FLIP2(span.y)*_w_ + span.x;                      \
  for (i = 0; i < span.end; i++, offset++) {                          \
+      vl_putpixel(offset, vl_mixfix(span.red, span.green, span.blue)); \
+      span.red += span.redStep;                                                \
+      span.green += span.greenStep;                                    \
+      span.blue += span.blueStep;                                      \
  }
 
 #include "swrast/s_tritemp.h"
 
-#else  /* MATROX */
-
-static void tri_rgb_iter (GLcontext *ctx,
-                          const SWvertex *v0,
-                          const SWvertex *v1,
-                          const SWvertex *v2)
-{
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint _b_ = dmesa->Buffer->height - 1;
- MGAvertex m0, m1, m2;
- m0.win[0] = v0->win[0];
- m0.win[1] = FLIP2(v0->win[1]);
- m1.win[0] = v1->win[0];
- m1.win[1] = FLIP2(v1->win[1]);
- m2.win[0] = v2->win[0];
- m2.win[1] = FLIP2(v2->win[1]);
- *(unsigned long *)m0.color = *(unsigned long *)v0->color;
- *(unsigned long *)m1.color = *(unsigned long *)v1->color;
- *(unsigned long *)m2.color = *(unsigned long *)v2->color;
- mga_draw_tri_rgb_iter((int)SWRAST_CONTEXT(ctx)->_backface_sign, &m0, &m1, &m2);
-}
-#endif /* MATROX */
-
-
 
 /*
  * Z-less iterated triangle.
  */
-#ifndef MATROX
-
 #define NAME tri_rgb_iter_zless
 
 #define INTERP_Z 1
@@ -727,177 +528,101 @@ static void tri_rgb_iter (GLcontext *ctx,
 #define INTERP_RGB 1
 
 #define SETUP_CODE \
const DMesaContext dmesa = (DMesaContext)ctx; \
GLuint _b_ = dmesa->Buffer->height - 1; \
GLuint _w_ = dmesa->Buffer->width;
  const DMesaContext dmesa = (DMesaContext)ctx;\
  GLuint _b_ = dmesa->buffer->height - 1;     \
  GLuint _w_ = dmesa->buffer->width;
 
 #define RENDER_SPAN(span) \
GLuint i, offset = FLIP2(span.y)*_w_ + span.x;                                \
for (i = 0; i < span.end; i++, offset++) {                            \
-     const DEPTH_TYPE z = FixedToDepth(span.z);                                \
-     if (z < zRow[i]) {                                                        \
-        vl_putpixel(offset, vl_mixfix(span.red, span.green, span.blue));\
-        zRow[i] = z;                                                   \
-     }                                                                 \
-     span.red += span.redStep;                                         \
-     span.green += span.greenStep;                                     \
-     span.blue += span.blueStep;                                       \
-     span.z += span.zStep;                                             \
- }
  GLuint i, offset = FLIP2(span.y)*_w_ + span.x;                      \
  for (i = 0; i < span.end; i++, offset++) {                          \
+      const DEPTH_TYPE z = FixedToDepth(span.z);                       \
+      if (z < zRow[i]) {                                               \
+         vl_putpixel(offset, vl_mixfix(span.red, span.green, span.blue));\
+         zRow[i] = z;                                                  \
+      }                                                                        \
+      span.red += span.redStep;                                                \
+      span.green += span.greenStep;                                    \
+      span.blue += span.blueStep;                                      \
+      span.z += span.zStep;                                            \
  }
 
 #include "swrast/s_tritemp.h"
 
-#else  /* MATROX */
-
-static void tri_rgb_iter_zless (GLcontext *ctx,
-                                const SWvertex *v0,
-                                const SWvertex *v1,
-                                const SWvertex *v2)
-{
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint _b_ = dmesa->Buffer->height - 1;
- MGAvertex m0, m1, m2;
- m0.win[0] = v0->win[0];
- m0.win[1] = FLIP2(v0->win[1]);
- m0.win[2] = v0->win[2];
- m1.win[0] = v1->win[0];
- m1.win[1] = FLIP2(v1->win[1]);
- m1.win[2] = v1->win[2];
- m2.win[0] = v2->win[0];
- m2.win[1] = FLIP2(v2->win[1]);
- m2.win[2] = v2->win[2];
- *(unsigned long *)m0.color = *(unsigned long *)v0->color;
- *(unsigned long *)m1.color = *(unsigned long *)v1->color;
- *(unsigned long *)m2.color = *(unsigned long *)v2->color;
- mga_draw_tri_rgb_iter_zless((int)SWRAST_CONTEXT(ctx)->_backface_sign, &m0, &m1, &m2);
-}
-#endif /* MATROX */
-
-
 
 /*
  * Analyze context state to see if we can provide a fast triangle function
  * Otherwise, return NULL.
  */
-static swrast_tri_func dmesa_choose_tri_function (GLcontext *ctx)
+static swrast_tri_func
+dmesa_choose_tri_function (GLcontext *ctx)
 {
- const SWcontext *swrast = SWRAST_CONTEXT(ctx);
-
- if ((ctx->RenderMode != GL_RENDER)
-     || (ctx->Polygon.SmoothFlag)
-     || (ctx->Polygon.StippleFlag)
-     || (ctx->Texture._EnabledUnits)
-     || (swrast->_RasterMask & MULTI_DRAW_BIT)
-     || (ctx->Polygon.CullFlag && ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK)) {
-    return (swrast_tri_func)NULL;
- }
-
- if (swrast->_RasterMask==DEPTH_BIT
-     && ctx->Depth.Func==GL_LESS
-     && ctx->Depth.Mask==GL_TRUE
-     && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) {
-    return (ctx->Light.ShadeModel==GL_SMOOTH) ? tri_rgb_iter_zless : tri_rgb_flat_zless;
- }
-
- if (swrast->_RasterMask==0) { /* no depth test */
-    return (ctx->Light.ShadeModel==GL_SMOOTH) ? tri_rgb_iter : tri_rgb_flat;
- }
-
- return (swrast_tri_func)NULL;
  const SWcontext *swrast = SWRAST_CONTEXT(ctx);
+
  if ((ctx->RenderMode != GL_RENDER)
+       || (ctx->Polygon.SmoothFlag)
+       || (ctx->Polygon.StippleFlag)
+       || (ctx->Texture._EnabledUnits)
+       || (swrast->_RasterMask & MULTI_DRAW_BIT)
+       || (ctx->Polygon.CullFlag && ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK)) {
+      return (swrast_tri_func)NULL;
  }
+
  if (swrast->_RasterMask==DEPTH_BIT
+       && ctx->Depth.Func==GL_LESS
+       && ctx->Depth.Mask==GL_TRUE
+       && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) {
+      return (ctx->Light.ShadeModel==GL_SMOOTH) ? tri_rgb_iter_zless : tri_rgb_flat_zless;
  }
+
  if (swrast->_RasterMask==0) { /* no depth test */
+      return (ctx->Light.ShadeModel==GL_SMOOTH) ? tri_rgb_iter : tri_rgb_flat;
  }
+
  return (swrast_tri_func)NULL;
 }
 
 
-
 /* Override for the swrast triangle-selection function.  Try to use one
  * of our internal triangle functions, otherwise fall back to the
  * standard swrast functions.
  */
-static void dmesa_choose_tri (GLcontext *ctx)
+static void
+dmesa_choose_tri (GLcontext *ctx)
 {
- SWcontext *swrast = SWRAST_CONTEXT(ctx);
  SWcontext *swrast = SWRAST_CONTEXT(ctx);
 
- if (!(swrast->Triangle=dmesa_choose_tri_function(ctx)))
-    _swrast_choose_triangle(ctx);
+   if (!(swrast->Triangle=dmesa_choose_tri_function(ctx))) {
+      _swrast_choose_triangle(ctx);
+   }
 }
 
 
-
 /****************************************************************************
  * Optimized line rendering
  ***************************************************************************/
 
-#ifdef MATROX
-static __inline void matrox_line_clip_hack (GLcontext *ctx, int _b_, MGAvertex *m0, const SWvertex *vert0, MGAvertex *m1, const SWvertex *vert1)
-{
- int x0 = vert0->win[0];
- int y0 = vert0->win[1];
- int x1 = vert1->win[0];
- int y1 = vert1->win[1];
- /* s_linetemp.h { */
- GLint w = ctx->DrawBuffer->Width;
- GLint h = ctx->DrawBuffer->Height;
- if ((x0==w) | (x1==w)) {
-    if ((x0==w) & (x1==w))
-       return;
-    x0 -= x0==w;
-    x1 -= x1==w;
- }
- if ((y0==h) | (y1==h)) {
-    if ((y0==h) & (y1==h))
-       return;
-    y0 -= y0==h;
-    y1 -= y1==h;
- }
- /* } s_linetemp.h */
- m0->win[0] = x0;
- m0->win[1] = FLIP2(y0);
- m1->win[0] = x1;
- m1->win[1] = FLIP2(y1);
-}
-#endif
-
 /*
  * NON-depth-buffered flat line.
  */
-#ifndef MATROX
-
 #define NAME line_rgb_flat
 
 #define INTERP_XY 1
 #define CLIP_HACK 1
 
 #define SETUP_CODE \
const DMesaContext dmesa = (DMesaContext)ctx; \
GLuint _b_ = dmesa->Buffer->height - 1; \
GLuint _w_ = dmesa->Buffer->width; \
- GLuint rgb = vl_mixrgb(vert1->color);
  const DMesaContext dmesa = (DMesaContext)ctx;\
  GLuint _b_ = dmesa->buffer->height - 1;     \
  GLuint _w_ = dmesa->buffer->width;          \
  GLuint rgb = vl_mixrgb(vert1->color);
 
 #define PLOT(X,Y) vl_putpixel(FLIP2(Y) * _w_ + X, rgb);
 
 #include "swrast/s_linetemp.h"
 
-#else  /* MATROX */
-
-static void line_rgb_flat (GLcontext *ctx,
-                           const SWvertex *vert0,
-                           const SWvertex *vert1)
-{
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint _b_ = dmesa->Buffer->height - 1;
- MGAvertex m0, m1;
- matrox_line_clip_hack(ctx, _b_, &m0, vert0, &m1, vert1);
- *(unsigned long *)m1.color = *(unsigned long *)vert1->color;
- mga_draw_line_rgb_flat(&m0, &m1);
-}
-#endif /* MATROX */
-
-
 
 /*
  * Z-less flat line.
  */
-#ifndef MATROX
-
 #define NAME line_rgb_flat_zless
 
 #define INTERP_XY 1
@@ -906,277 +631,235 @@ static void line_rgb_flat (GLcontext *ctx,
 #define CLIP_HACK 1
 
 #define SETUP_CODE \
const DMesaContext dmesa = (DMesaContext)ctx; \
GLuint _b_ = dmesa->Buffer->height - 1; \
GLuint _w_ = dmesa->Buffer->width; \
- GLuint rgb = vl_mixrgb(vert1->color);
  const DMesaContext dmesa = (DMesaContext)ctx;\
  GLuint _b_ = dmesa->buffer->height - 1;     \
  GLuint _w_ = dmesa->buffer->width;          \
  GLuint rgb = vl_mixrgb(vert1->color);
 
 #define PLOT(X,Y) \
if (Z < *zPtr) {                              \
-    *zPtr = Z;                                 \
-    vl_putpixel(FLIP2(Y) * _w_ + X, rgb);      \
- }
  if (Z < *zPtr) {                            \
+      *zPtr = Z;                               \
+      vl_putpixel(FLIP2(Y) * _w_ + X, rgb);    \
  }
 
 #include "swrast/s_linetemp.h"
 
-#else  /* MATROX */
-
-static void line_rgb_flat_zless (GLcontext *ctx,
-                                 const SWvertex *vert0,
-                                 const SWvertex *vert1)
-{
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint _b_ = dmesa->Buffer->height - 1;
- MGAvertex m0, m1;
- matrox_line_clip_hack(ctx, _b_, &m0, vert0, &m1, vert1);
- m0.win[2] = vert0->win[2];
- m1.win[2] = vert1->win[2];
- *(unsigned long *)m1.color = *(unsigned long *)vert1->color;
- mga_draw_line_rgb_flat_zless(&m0, &m1);
-}
-#endif /* MATROX */
-
-
 
-#ifndef MATROX
-#define line_rgb_iter NULL
-#define line_rgb_iter_zless NULL
-#else  /* MATROX */
 /*
  * NON-depth-buffered iterated line.
  */
-static void line_rgb_iter (GLcontext *ctx,
-                           const SWvertex *vert0,
-                           const SWvertex *vert1)
-{
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint _b_ = dmesa->Buffer->height - 1;
- MGAvertex m0, m1;
- matrox_line_clip_hack(ctx, _b_, &m0, vert0, &m1, vert1);
- *(unsigned long *)m0.color = *(unsigned long *)vert0->color;
- *(unsigned long *)m1.color = *(unsigned long *)vert1->color;
- mga_draw_line_rgb_iter(&m0, &m1);
-}
-
+#define line_rgb_iter NULL
 
 
 /*
  * Z-less iterated line.
  */
-static void line_rgb_iter_zless (GLcontext *ctx,
-                                 const SWvertex *vert0,
-                                 const SWvertex *vert1)
-{
- const DMesaContext dmesa = (DMesaContext)ctx;
- GLuint _b_ = dmesa->Buffer->height - 1;
- MGAvertex m0, m1;
- matrox_line_clip_hack(ctx, _b_, &m0, vert0, &m1, vert1);
- m0.win[2] = vert0->win[2];
- m1.win[2] = vert1->win[2];
- *(unsigned long *)m0.color = *(unsigned long *)vert0->color;
- *(unsigned long *)m1.color = *(unsigned long *)vert1->color;
- mga_draw_line_rgb_iter_zless(&m0, &m1);
-}
-#endif /* MATROX */
-
+#define line_rgb_iter_zless NULL
 
 
 /*
  * Analyze context state to see if we can provide a fast line function
  * Otherwise, return NULL.
  */
-static swrast_line_func dmesa_choose_line_function (GLcontext *ctx)
+static swrast_line_func
+dmesa_choose_line_function (GLcontext *ctx)
 {
- const SWcontext *swrast = SWRAST_CONTEXT(ctx);
-
- if ((ctx->RenderMode != GL_RENDER)
-     || (ctx->Line.SmoothFlag)
-     || (ctx->Texture._EnabledUnits)
-     || (ctx->Line.StippleFlag)
-     || (swrast->_RasterMask & MULTI_DRAW_BIT)
-     || (ctx->Line.Width!=1.0F)) {
-    return (swrast_line_func)NULL;
- }
-
- if (swrast->_RasterMask==DEPTH_BIT
-     && ctx->Depth.Func==GL_LESS
-     && ctx->Depth.Mask==GL_TRUE
-     && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) {
-    return (ctx->Light.ShadeModel==GL_SMOOTH) ? line_rgb_iter_zless : line_rgb_flat_zless;
- }
-
- if (swrast->_RasterMask==0) { /* no depth test */
-    return (ctx->Light.ShadeModel==GL_SMOOTH) ? line_rgb_iter : line_rgb_flat;
- }
-
- return (swrast_line_func)NULL;
  const SWcontext *swrast = SWRAST_CONTEXT(ctx);
+
  if ((ctx->RenderMode != GL_RENDER)
+       || (ctx->Line.SmoothFlag)
+       || (ctx->Texture._EnabledUnits)
+       || (ctx->Line.StippleFlag)
+       || (swrast->_RasterMask & MULTI_DRAW_BIT)
+       || (ctx->Line.Width!=1.0F)) {
+      return (swrast_line_func)NULL;
  }
+
  if (swrast->_RasterMask==DEPTH_BIT
+       && ctx->Depth.Func==GL_LESS
+       && ctx->Depth.Mask==GL_TRUE
+       && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS) {
+      return (ctx->Light.ShadeModel==GL_SMOOTH) ? line_rgb_iter_zless : line_rgb_flat_zless;
  }
+
  if (swrast->_RasterMask==0) { /* no depth test */
+      return (ctx->Light.ShadeModel==GL_SMOOTH) ? line_rgb_iter : line_rgb_flat;
  }
+
  return (swrast_line_func)NULL;
 }
 
 
-
 /* Override for the swrast line-selection function.  Try to use one
  * of our internal line functions, otherwise fall back to the
  * standard swrast functions.
  */
-static void dmesa_choose_line (GLcontext *ctx)
+static void
+dmesa_choose_line (GLcontext *ctx)
 {
- SWcontext *swrast = SWRAST_CONTEXT(ctx);
  SWcontext *swrast = SWRAST_CONTEXT(ctx);
 
- if (!(swrast->Line=dmesa_choose_line_function(ctx)))
-    _swrast_choose_line(ctx);
+   if (!(swrast->Line=dmesa_choose_line_function(ctx))) {
+      _swrast_choose_line(ctx);
+   }
 }
 
 
-
 /****************************************************************************
  * Miscellaneous device driver funcs
  ***************************************************************************/
-
-static void clear_index (GLcontext *ctx, GLuint index)
+static const struct gl_texture_format *
+choose_tex_format (GLcontext *ctx, GLint internalFormat,
+                   GLenum format, GLenum type)
 {
- ((DMesaContext)ctx)->ClearIndex = index;
+   switch (internalFormat) {
+      case GL_COMPRESSED_RGB_ARB:
+         return &_mesa_texformat_rgb;
+      case GL_COMPRESSED_RGBA_ARB:
+         return &_mesa_texformat_rgba;
+      default:
+         return _mesa_choose_tex_format(ctx, internalFormat, format, type);
+   }
 }
 
-static void clear_color (GLcontext *ctx, const GLfloat color[4])
+
+static void
+clear_index (GLcontext *ctx, GLuint index)
 {
- GLubyte col[4];
- CLAMPED_FLOAT_TO_UBYTE(col[0], color[0]);
- CLAMPED_FLOAT_TO_UBYTE(col[1], color[1]);
- CLAMPED_FLOAT_TO_UBYTE(col[2], color[2]);
- CLAMPED_FLOAT_TO_UBYTE(col[3], color[3]);
- ((DMesaContext)ctx)->ClearColor = vl_mixrgba(col);
+   ((DMesaContext)ctx)->ClearIndex = index;
 }
 
 
-
-static void clear (GLcontext *ctx, GLbitfield mask, GLboolean all,
-                   GLint x, GLint y, GLint width, GLint height)
+static void
+clear_color (GLcontext *ctx, const GLfloat color[4])
 {
- const DMesaContext c = (DMesaContext)ctx;
- const GLuint *colorMask = (GLuint *)&ctx->Color.ColorMask;
+   GLubyte col[4];
+   CLAMPED_FLOAT_TO_UBYTE(col[0], color[0]);
+   CLAMPED_FLOAT_TO_UBYTE(col[1], color[1]);
+   CLAMPED_FLOAT_TO_UBYTE(col[2], color[2]);
+   CLAMPED_FLOAT_TO_UBYTE(col[3], color[3]);
+   ((DMesaContext)ctx)->ClearColor = vl_mixrgba(col);
+}
 
-/*
- * Clear the specified region of the buffers indicated by 'mask'
- * using the clear color or index as specified by one of the two
- * functions above.
- * If all==GL_TRUE, clear whole buffer, else just clear region defined
- * by x,y,width,height
- */
 
- /* we can't handle color or index masking */
- if ((*colorMask == 0xffffffff) && (ctx->Color.IndexMask == 0xffffffff)) {
-#ifndef MATROX
-    if (mask & DD_BACK_LEFT_BIT) {
-       int color = c->visual->rgb_flag ? c->ClearColor : c->ClearIndex;
-
-       if (all) {
-          vl_clear(color);
-       } else {
-          vl_rect(x, y, width, height, color);
-       }
-
-       mask &= ~DD_BACK_LEFT_BIT;
-    }
-#else  /* MATROX */
-    unsigned short z = -1;
-    int color = c->ClearColor;
-    if (mask & DD_DEPTH_BIT) {
-       z = ctx->Depth.Clear * 0xffff;
-    }
-    if (all) {
-       mga_clear(mask & DD_FRONT_LEFT_BIT,
-                 mask & DD_BACK_LEFT_BIT,
-                 mask & DD_DEPTH_BIT,
-                 0, 0, c->Buffer->width, c->Buffer->height,
-                 color, z);
-    } else {
-       mga_clear(mask & DD_FRONT_LEFT_BIT,
-                 mask & DD_BACK_LEFT_BIT,
-                 mask & DD_DEPTH_BIT,
-                 x, y, width, height,
-                 color, z);
-    }
-    mask &= ~(DD_FRONT_LEFT_BIT | DD_BACK_LEFT_BIT | DD_DEPTH_BIT);
-#endif /* MATROX */
- }
-
- if (mask) {
-    _swrast_Clear(ctx, mask, all, x, y, width, height);
- }
+static void
+clear (GLcontext *ctx, GLbitfield mask, GLboolean all,
+       GLint x, GLint y, GLint width, GLint height)
+{
+   const DMesaContext c = (DMesaContext)ctx;
+   const GLuint *colorMask = (GLuint *)&ctx->Color.ColorMask;
+
+   /*
+    * Clear the specified region of the buffers indicated by 'mask'
+    * using the clear color or index as specified by one of the two
+    * functions above.
+    * If all==GL_TRUE, clear whole buffer, else just clear region defined
+    * by x,y,width,height
+    */
+
+   /* we can't handle color or index masking */
+   if ((*colorMask == 0xffffffff) && (ctx->Color.IndexMask == 0xffffffff)) {
+      if (mask & DD_BACK_LEFT_BIT) {
+         int color = ((GLvisual *)(c->visual))->rgbMode ? c->ClearColor : c->ClearIndex;
+
+         if (all) {
+            vl_clear(color);
+         } else {
+            vl_rect(x, c->buffer->height - y - height, width, height, color);
+         }
+
+         mask &= ~DD_BACK_LEFT_BIT;
+      }
+   }
+
+   if (mask) {
+      _swrast_Clear(ctx, mask, all, x, y, width, height);
+   }
 }
 
 
-
-static void set_buffer (GLcontext *ctx, GLframebuffer *colorBuffer, GLuint bufferBit)
+/*
+ * This function is called to specify which buffer to read and write
+ * for software rasterization (swrast) fallbacks.  This doesn't necessarily
+ * correspond to glDrawBuffer() or glReadBuffer() calls.
+ */
+static void
+set_buffer (GLcontext *ctx, GLframebuffer *colorBuffer, GLuint bufferBit)
 {
- /*
-  * XXX todo - examine bufferBit and set read/write pointers
-  */
+   /*
+    * XXX todo - examine bufferBit and set read/write pointers
+    */
+   /* Normally, we would have
+    *    ctx->Driver.ReadBuffer == set_read_buffer
+    *    ctx->Driver.DrawBuffer == set_draw_buffer
+    * and make sure set_draw_buffer calls _swrast_DrawBuffer,
+    * which in turn will call this routine via dd->SetBuffer.
+    */
 }
 
 
-
 /*
  * Return the width and height of the current buffer.
  * If anything special has to been done when the buffer/window is
  * resized, do it now.
  */
-static void get_buffer_size (GLframebuffer *buffer, GLuint *width, GLuint *height)
+static void
+get_buffer_size (GLframebuffer *buffer, GLuint *width, GLuint *height)
 {
- DMesaBuffer b = (DMesaBuffer)buffer;
  DMesaBuffer b = (DMesaBuffer)buffer;
 
- *width  = b->width;
- *height = b->height;
  *width  = b->width;
  *height = b->height;
 }
 
 
-
-static const GLubyte* get_string (GLcontext *ctx, GLenum name)
+static void
+viewport(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h)
 {
- switch (name) {
-        case GL_RENDERER:
-             return (const GLubyte *)"Mesa DJGPP"
-                                     #ifdef FX
-                                     " (FX)"
-                                     #endif
-                                     #ifdef MATROX
-                                     " (MGA)"
-                                     #endif
-                                     "\0port (c) Borca Daniel mar-2003";
-        default:
-             return NULL;
- }
+   /* poll for window size change and realloc software Z/stencil/etc if needed */
+   _mesa_ResizeBuffersMESA();
 }
 
 
-
-static void finish (GLcontext *ctx)
+static const GLubyte *
+get_string (GLcontext *ctx, GLenum name)
 {
- /*
-  * XXX todo - OPTIONAL FUNCTION: implements glFinish if possible
-  */
+   switch (name) {
+      case GL_RENDERER:
+         return (const GLubyte *)"Mesa DJGPP";
+      default:
+         return NULL;
+   }
 }
 
 
-
-static void flush (GLcontext *ctx)
+static void
+finish (GLcontext *ctx)
 {
- /*
-  * XXX todo - OPTIONAL FUNCTION: implements glFlush if possible
-  */
  /*
+    * XXX todo - OPTIONAL FUNCTION: implements glFinish if possible
+    */
 }
 
 
+static void
+flush (GLcontext *ctx)
+{
+   /*
+    * XXX todo - OPTIONAL FUNCTION: implements glFlush if possible
+    */
+}
+
 
 /****************************************************************************
  * State
  ***************************************************************************/
-#define DMESA_NEW_LINE   (_NEW_LINE | \
-                          _NEW_TEXTURE | \
-                          _NEW_LIGHT | \
-                          _NEW_DEPTH | \
-                          _NEW_RENDERMODE | \
-                          _SWRAST_NEW_RASTERMASK)
+#define DMESA_NEW_LINE (_NEW_LINE | \
+                        _NEW_TEXTURE | \
+                        _NEW_LIGHT | \
+                        _NEW_DEPTH | \
+                        _NEW_RENDERMODE | \
+                        _SWRAST_NEW_RASTERMASK)
 
 #define DMESA_NEW_TRIANGLE (_NEW_POLYGON | \
                             _NEW_TEXTURE | \
@@ -1188,140 +871,89 @@ static void flush (GLcontext *ctx)
 /* Extend the software rasterizer with our line and triangle
  * functions.
  */
-static void dmesa_register_swrast_functions (GLcontext *ctx)
+static void
+dmesa_register_swrast_functions (GLcontext *ctx)
 {
- SWcontext *swrast = SWRAST_CONTEXT(ctx);
  SWcontext *swrast = SWRAST_CONTEXT(ctx);
 
- swrast->choose_line = dmesa_choose_line;
- swrast->choose_triangle = dmesa_choose_tri;
  swrast->choose_line = dmesa_choose_line;
  swrast->choose_triangle = dmesa_choose_tri;
 
- swrast->invalidate_line |= DMESA_NEW_LINE;
- swrast->invalidate_triangle |= DMESA_NEW_TRIANGLE;
  swrast->invalidate_line |= DMESA_NEW_LINE;
  swrast->invalidate_triangle |= DMESA_NEW_TRIANGLE;
 }
 
 
+static void
+dmesa_update_state (GLcontext *ctx, GLuint new_state)
+{
+   /* Propagate statechange information to swrast and swrast_setup
+    * modules. The DMesa driver has no internal GL-dependent state.
+    */
+   _swrast_InvalidateState( ctx, new_state );
+   _ac_InvalidateState( ctx, new_state );
+   _tnl_InvalidateState( ctx, new_state );
+   _swsetup_InvalidateState( ctx, new_state );
+}
+
 
-/* Setup pointers and other driver state that is constant for the life
- * of a context.
+/* Initialize the device driver function table with the functions
+ * we implement in this driver.
  */
-static void dmesa_init_pointers (GLcontext *ctx)
+static void
+dmesa_init_driver_functions (DMesaVisual visual,
+                             struct dd_function_table *driver)
 {
- TNLcontext *tnl;
- struct swrast_device_driver *dd = _swrast_GetDeviceDriverReference(ctx);
-
- ctx->Driver.GetString = get_string;
- ctx->Driver.GetBufferSize = get_buffer_size;
- ctx->Driver.Flush = flush;
- ctx->Driver.Finish = finish;
-    
- /* Software rasterizer pixel paths:
-  */
- ctx->Driver.Accum = _swrast_Accum;
- ctx->Driver.Bitmap = _swrast_Bitmap;
- ctx->Driver.Clear = clear;
- ctx->Driver.ResizeBuffers = _swrast_alloc_buffers;
- ctx->Driver.CopyPixels = _swrast_CopyPixels;
- ctx->Driver.DrawPixels = _swrast_DrawPixels;
- ctx->Driver.ReadPixels = _swrast_ReadPixels;
- ctx->Driver.DrawBuffer = _swrast_DrawBuffer;
-
- /* Software texture functions:
-  */
- ctx->Driver.ChooseTextureFormat = _mesa_choose_tex_format;
- ctx->Driver.TexImage1D = _mesa_store_teximage1d;
- ctx->Driver.TexImage2D = _mesa_store_teximage2d;
- ctx->Driver.TexImage3D = _mesa_store_teximage3d;
- ctx->Driver.TexSubImage1D = _mesa_store_texsubimage1d;
- ctx->Driver.TexSubImage2D = _mesa_store_texsubimage2d;
- ctx->Driver.TexSubImage3D = _mesa_store_texsubimage3d;
- ctx->Driver.TestProxyTexImage = _mesa_test_proxy_teximage;
-
- ctx->Driver.CopyTexImage1D = _swrast_copy_teximage1d;
- ctx->Driver.CopyTexImage2D = _swrast_copy_teximage2d;
- ctx->Driver.CopyTexSubImage1D = _swrast_copy_texsubimage1d;
- ctx->Driver.CopyTexSubImage2D = _swrast_copy_texsubimage2d;
- ctx->Driver.CopyTexSubImage3D = _swrast_copy_texsubimage3d;
-
- ctx->Driver.CompressedTexImage1D = _mesa_store_compressed_teximage1d;
- ctx->Driver.CompressedTexImage2D = _mesa_store_compressed_teximage2d;
- ctx->Driver.CompressedTexImage3D = _mesa_store_compressed_teximage3d;
- ctx->Driver.CompressedTexSubImage1D = _mesa_store_compressed_texsubimage1d;
- ctx->Driver.CompressedTexSubImage2D = _mesa_store_compressed_texsubimage2d;
- ctx->Driver.CompressedTexSubImage3D = _mesa_store_compressed_texsubimage3d;
-
- /* Swrast hooks for imaging extensions:
-  */
- ctx->Driver.CopyColorTable = _swrast_CopyColorTable;
- ctx->Driver.CopyColorSubTable = _swrast_CopyColorSubTable;
- ctx->Driver.CopyConvolutionFilter1D = _swrast_CopyConvolutionFilter1D;
- ctx->Driver.CopyConvolutionFilter2D = _swrast_CopyConvolutionFilter2D;
-
- /* Statechange callbacks:
-  */
- ctx->Driver.ClearColor = clear_color;
- ctx->Driver.ClearIndex = clear_index;
-
- /* Initialize the TNL driver interface:
-  */
- tnl = TNL_CONTEXT(ctx);
- tnl->Driver.RunPipeline = _tnl_run_pipeline;
-
- dd->SetBuffer = set_buffer;
-   
- /* Install swsetup for tnl->Driver.Render.*:
-  */
- _swsetup_Wakeup(ctx);
-
- /* The span functions should be in `dmesa_update_state', but I'm
-  * pretty sure they will never change during the life of the Visual
-  */
-#ifdef MATROX
- if (((DMesaContext)ctx)->visual->zbuffer == -1) {
-    /* Depth span/pixel functions */
-    dd->WriteDepthSpan = write_depth_span;
-    dd->WriteDepthPixels = write_depth_pixels;
-    dd->ReadDepthSpan = read_depth_span;
-    dd->ReadDepthPixels = read_depth_pixels;
- }
+   driver->UpdateState = dmesa_update_state;
+   driver->GetString = get_string;
+   driver->GetBufferSize = get_buffer_size;
+   driver->Viewport = viewport;
+   driver->Flush = flush;
+   driver->Finish = finish;
+   driver->Clear = clear;
+   driver->ClearColor = clear_color;
+   driver->ClearIndex = clear_index;
+#if SWTC
+   driver->ChooseTextureFormat = choose_tex_format;
 #endif
-
-#ifndef MATROX
- /* Index span/pixel functions */
- dd->WriteCI32Span = write_index_span;
- dd->WriteCI8Span = write_index8_span;
- dd->WriteMonoCISpan = write_mono_index_span;
- dd->WriteCI32Pixels = write_index_pixels;
- dd->WriteMonoCIPixels = write_mono_index_pixels;
- dd->ReadCI32Span = read_index_span;
- dd->ReadCI32Pixels = read_index_pixels;
-#endif
-
- /* RGB(A) span/pixel functions */
- dd->WriteRGBASpan = write_rgba_span;
- dd->WriteRGBSpan = write_rgb_span;
- dd->WriteMonoRGBASpan = write_mono_rgba_span;
- dd->WriteRGBAPixels = write_rgba_pixels;
- dd->WriteMonoRGBAPixels = write_mono_rgba_pixels;
- dd->ReadRGBASpan = read_rgba_span;
- dd->ReadRGBAPixels = read_rgba_pixels;
 }
 
 
-
-static void dmesa_update_state (GLcontext *ctx, GLuint new_state)
+/* Setup pointers and other driver state that is constant for the life
+ * of a context.
+ */
+static void
+dmesa_init_pointers (GLcontext *ctx)
 {
- /* Propogate statechange information to swrast and swrast_setup
-  * modules. The DMesa driver has no internal GL-dependent state.
-  */
- _swrast_InvalidateState( ctx, new_state );
- _ac_InvalidateState( ctx, new_state );
- _tnl_InvalidateState( ctx, new_state );
- _swsetup_InvalidateState( ctx, new_state );
+   struct swrast_device_driver *dd = _swrast_GetDeviceDriverReference(ctx);
+
+   dd->SetBuffer = set_buffer;
+
+   /* The span functions should be in `dmesa_update_state', but I'm
+    * pretty sure they will never change during the life of the Visual
+    */
+
+   /* Index span/pixel functions */
+   dd->WriteCI32Span = write_index_span;
+   dd->WriteCI8Span = write_index8_span;
+   dd->WriteMonoCISpan = write_mono_index_span;
+   dd->WriteCI32Pixels = write_index_pixels;
+   dd->WriteMonoCIPixels = write_mono_index_pixels;
+   dd->ReadCI32Span = read_index_span;
+   dd->ReadCI32Pixels = read_index_pixels;
+
+   /* RGB(A) span/pixel functions */
+   dd->WriteRGBASpan = write_rgba_span;
+   dd->WriteRGBSpan = write_rgb_span;
+   dd->WriteMonoRGBASpan = write_mono_rgba_span;
+   dd->WriteRGBAPixels = write_rgba_pixels;
+   dd->WriteMonoRGBAPixels = write_mono_rgba_pixels;
+   dd->ReadRGBASpan = read_rgba_span;
+   dd->ReadRGBAPixels = read_rgba_pixels;
 }
 #endif /* FX */
 
 
-
 /****************************************************************************
  * DMesa Public API Functions
  ***************************************************************************/
@@ -1329,408 +961,468 @@ static void dmesa_update_state (GLcontext *ctx, GLuint new_state)
 /*
  * The exact arguments to this function will depend on your window system
  */
-DMesaVisual DMesaCreateVisual (GLint width,
-                               GLint height,
-                               GLint colDepth,
-                               GLint refresh,
-                               GLboolean dbFlag,
-                               GLboolean rgbFlag,
-                               GLboolean alphaFlag,
-                               GLint depthSize,
-                               GLint stencilSize,
-                               GLint accumSize)
+DMesaVisual
+DMesaCreateVisual (GLint width,
+                   GLint height,
+                   GLint colDepth,
+                   GLint refresh,
+                   GLboolean dbFlag,
+                   GLboolean rgbFlag,
+                   GLint alphaSize,
+                   GLint depthSize,
+                   GLint stencilSize,
+                   GLint accumSize)
 {
-#ifndef FX
- DMesaVisual v;
- GLint redBits, greenBits, blueBits, alphaBits, indexBits;
-
-#ifndef MATROX
- if (!dbFlag) {
-    return NULL;
- }
-#else
- if (!rgbFlag) {
-    return NULL;
- }
-#endif
-
- alphaBits = 0;
-
- if (!rgbFlag) {
-    indexBits = 8;
-    redBits = 0;
-    greenBits = 0;
-    blueBits = 0;
- } else {
-    indexBits = 0;
-    switch (colDepth) {
-           case 8:
-                redBits = 8;
-                greenBits = 8;
-                blueBits = 8;
-                break;
-           case 15:
-                redBits = 5;
-                greenBits = 5;
-                blueBits = 5;
-                break;
-           case 16:
-                redBits = 5;
-                greenBits = 6;
-                blueBits = 5;
-                break;
-           case 32:
-                alphaBits = 8;
-           case 24:
-                redBits = 8;
-                greenBits = 8;
-                blueBits = 8;
-                break;
-           default:
-                return NULL;
-    }
- }
-
-#ifndef MATROX
- if ((colDepth=vl_video_init(width, height, colDepth, rgbFlag, refresh)) <= 0) {
-    return NULL;
- }
-#else
- if (mga_open(width, height, colDepth, dbFlag ? 2 : 1, depthSize == 16, refresh) < 0) {
-    return NULL;
- }
-#endif
-
- if (alphaFlag && (alphaBits==0)) {
-    alphaBits = 8;
- }
-
- if ((v=(DMesaVisual)CALLOC_STRUCT(dmesa_visual)) != NULL) {
-    /* Create core visual */
-    _mesa_initialize_visual((GLvisual *)v,
-                            rgbFlag,           /* rgb */
-                            dbFlag,
-                            GL_FALSE,          /* stereo */
-                            redBits,
-                            greenBits,
-                            blueBits,
-                            alphaBits,
-                            indexBits,         /* indexBits */
-                            depthSize,
-                            stencilSize,
-                            accumSize,         /* accumRed */
-                            accumSize,         /* accumGreen */
-                            accumSize,         /* accumBlue */
-                            alphaFlag?accumSize:0,     /* accumAlpha */
-                            1);                        /* numSamples */
-
-    v->depth = colDepth;
-    v->db_flag = dbFlag;
-    v->rgb_flag = rgbFlag;
-
-    v->zbuffer = (depthSize > 0) ? 1 : 0;
-#ifdef MATROX
-    mga_get(MGA_GET_HPIXELS, &v->stride_in_pixels);
-    if (depthSize == 16) {
-       v->zbuffer = -1;
-    }
-#endif
- }
-
- return v;
+   DMesaVisual v;
+   GLint redBits, greenBits, blueBits, alphaBits, indexBits;
+   GLboolean sw_alpha;
+
+   alphaBits = 0;
+
+   if (!rgbFlag) {
+      indexBits = 8;
+      redBits = 0;
+      greenBits = 0;
+      blueBits = 0;
+   } else {
+      indexBits = 0;
+      switch (colDepth) {
+         case 8:
+            redBits = 8;
+            greenBits = 8;
+            blueBits = 8;
+            break;
+         case 15:
+            alphaBits = 1;
+            redBits = 5;
+            greenBits = 5;
+            blueBits = 5;
+            break;
+         case 16:
+            redBits = 5;
+            greenBits = 6;
+            blueBits = 5;
+            break;
+         case 32:
+            alphaBits = 8;
+         case 24:
+            redBits = 8;
+            greenBits = 8;
+            blueBits = 8;
+            break;
+         default:
+            return NULL;
+      }
+   }
+
+   /* Okay,
+    * `alphaBits' is what we can provide
+    * `alphaSize' is what app requests
+    *
+    * Note that alpha buffering is required only if destination alpha is used
+    * in alpha blending; alpha blending modes that do not use destination alpha
+    * can be used w/o alpha buffer.
+    *
+    * We will use whatever ALPHA app requests. Later, in `CreateBuffer' we'll
+    * instruct Mesa to use its own ALPHA buffer, by passing a non-FALSE value
+    * for ALPHA to `_mesa_initialize_framebuffer'.
+    *
+    * Basically, 32bit modes provide ALPHA storage, but can we rely on this?
+    */
+   alphaBits = alphaSize;
+   sw_alpha = (alphaBits > 0);
 
+#ifndef FX
+   if (!dbFlag) {
+      return NULL;
+   }
+   if ((colDepth=vl_video_init(width, height, colDepth, rgbFlag, refresh)) <= 0) {
+      return NULL;
+   }
 #else  /* FX */
+   if (!rgbFlag) {
+      return NULL;
+   } else {
+      char *env;
+
+      if ((env = getenv("MESA_FX_INFO")) && (env[0] == 'r')) {
+         freopen("MESA.LOG", "w", stderr);
+      }
+
+      if (refresh && (((env = getenv("FX_GLIDE_REFRESH")) == NULL) || !atoi(env))) {
+         /* if we are passed non-zero value for refresh, we need to override
+          * default refresh rate. However, if FX_GLIDE_REFRESH is already set
+          * to 0, we won't override it, because it has a special meaning for
+          * DJGPP Glide3x (switch via VESA, using BIOS default refresh).
+          */
+         char tmp[32];
+         sprintf(tmp, "FX_GLIDE_REFRESH=%u", refresh);
+         putenv(tmp);
+      }
+   }
+#endif /* FX */
 
- int i = 0, fx_attrib[32];
-
- if (!rgbFlag) {
-    return NULL;
- }
+   if ((v=(DMesaVisual)CALLOC_STRUCT(dmesa_visual)) != NULL) {
+      /* Create core visual */
+      _mesa_initialize_visual((GLvisual *)v,
+                              rgbFlag,         /* rgb */
+                              dbFlag,
+                              GL_FALSE,                /* stereo */
+                              redBits,
+                              greenBits,
+                              blueBits,
+                              alphaBits,
+                              indexBits,               /* indexBits */
+                              depthSize,
+                              stencilSize,
+                              accumSize,               /* accumRed */
+                              accumSize,               /* accumGreen */
+                              accumSize,               /* accumBlue */
+                              alphaBits?accumSize:0,   /* accumAlpha */
+                              1);                      /* numSamples */
 
- if (dbFlag) fx_attrib[i++] = FXMESA_DOUBLEBUFFER;
- if (depthSize > 0) { fx_attrib[i++] = FXMESA_DEPTH_SIZE; fx_attrib[i++] = depthSize; }
- if (stencilSize > 0) { fx_attrib[i++] = FXMESA_STENCIL_SIZE; fx_attrib[i++] = stencilSize; }
- if (accumSize > 0) { fx_attrib[i++] = FXMESA_ACCUM_SIZE; fx_attrib[i++] = accumSize; }
- if (alphaFlag) { fx_attrib[i++] = FXMESA_ALPHA_SIZE; fx_attrib[i++] = 1; }
- fx_attrib[i] = FXMESA_NONE;
+#ifndef FX
+      v->sw_alpha = sw_alpha;
+      v->z_buffer = (depthSize > 0) ? 1 : 0;
+#endif
+   }
 
- return (DMesaVisual)fxMesaCreateBestContext(-1, width, height, fx_attrib);
-#endif /* FX */
+   return v;
 }
 
 
-
-void DMesaDestroyVisual (DMesaVisual v)
+void
+DMesaDestroyVisual (DMesaVisual v)
 {
 #ifndef FX
- _mesa_destroy_visual((GLvisual *)v);
-
-#ifndef MATROX
- vl_video_exit();
-#else
- mga_close(1, 1);
-#endif
-
-#else
- fxMesaDestroyContext((fxMesaContext)v);
+   vl_video_exit();
 #endif
+   _mesa_destroy_visual((GLvisual *)v);
 }
 
 
-
-DMesaBuffer DMesaCreateBuffer (DMesaVisual visual,
-                               GLint xpos, GLint ypos,
-                               GLint width, GLint height)
+DMesaBuffer
+DMesaCreateBuffer (DMesaVisual visual,
+                   GLint xpos, GLint ypos,
+                   GLint width, GLint height)
 {
 #ifndef FX
- DMesaBuffer b;
-
- if ((b=(DMesaBuffer)CALLOC_STRUCT(dmesa_buffer)) != NULL) {
-    _mesa_initialize_framebuffer((GLframebuffer *)b,
-                                 (GLvisual *)visual,
-                                 visual->zbuffer == 1,
-                                 ((GLvisual *)visual)->stencilBits > 0,
-                                 ((GLvisual *)visual)->accumRedBits > 0,
-                                 ((GLvisual *)visual)->alphaBits > 0);
-    b->xpos = xpos;
-    b->ypos = ypos;
-    b->width = width;
-    b->height = height;
- }
-
- return b;
-#else
- return (DMesaBuffer)visual;
-#endif
-}
+   DMesaBuffer b;
+
+   if ((b=(DMesaBuffer)CALLOC_STRUCT(dmesa_buffer)) != NULL) {
+      _mesa_initialize_framebuffer((GLframebuffer *)b,
+                                   (GLvisual *)visual,
+                                   visual->z_buffer == 1,
+                                   ((GLvisual *)visual)->stencilBits > 0,
+                                   ((GLvisual *)visual)->accumRedBits > 0,
+                                   visual->sw_alpha);
+      b->xpos = xpos;
+      b->ypos = ypos;
+      b->width = width;
+      b->height = height;
+   }
+
+   return b;
+#else  /* FX */
 
+   GLvisual *v = (GLvisual *)visual;
+   int i = 0, fx_attrib[32];
 
+   if (v->doubleBufferMode) fx_attrib[i++] = FXMESA_DOUBLEBUFFER;
+   if (v->depthBits > 0) { fx_attrib[i++] = FXMESA_DEPTH_SIZE; fx_attrib[i++] = v->depthBits; }
+   if (v->stencilBits > 0) { fx_attrib[i++] = FXMESA_STENCIL_SIZE; fx_attrib[i++] = v->stencilBits; }
+   if (v->accumRedBits > 0) { fx_attrib[i++] = FXMESA_ACCUM_SIZE; fx_attrib[i++] = v->accumRedBits; }
+   if (v->alphaBits) { fx_attrib[i++] = FXMESA_ALPHA_SIZE; fx_attrib[i++] = v->alphaBits; }
+   fx_attrib[i++] = FXMESA_COLORDEPTH;
+   fx_attrib[i++] = v->redBits + v->greenBits + v->blueBits;
+   fx_attrib[i] = FXMESA_NONE;
 
-void DMesaDestroyBuffer (DMesaBuffer b)
+   return (DMesaBuffer)fxMesaCreateBestContext(-1, width, height, fx_attrib);
+#endif /* FX */
+}
+
+
+void
+DMesaDestroyBuffer (DMesaBuffer b)
 {
 #ifndef FX
-#ifndef MATROX
- free(b->the_window);
-#endif
- _mesa_destroy_framebuffer((GLframebuffer *)b);
+   if (b->the_window != NULL) {
+      free(b->the_window);
+   }
+   _mesa_destroy_framebuffer((GLframebuffer *)b);
+#else
+   fxMesaDestroyContext((fxMesaContext)b);
 #endif
 }
 
 
-
-DMesaContext DMesaCreateContext (DMesaVisual visual,
-                                 DMesaContext share)
+DMesaContext
+DMesaCreateContext (DMesaVisual visual, DMesaContext share)
 {
+   GLcontext *c;
 #ifndef FX
DMesaContext c;
GLboolean direct = GL_FALSE;
-
if ((c=(DMesaContext)CALLOC_STRUCT(dmesa_context)) != NULL) {
-    _mesa_initialize_context((GLcontext *)c,
-                             (GLvisual *)visual,
-                             (GLcontext *)share,
-                             (void *)c, direct);
-
-    _mesa_enable_sw_extensions((GLcontext *)c);
-    _mesa_enable_1_3_extensions((GLcontext *)c);
-    _mesa_enable_1_4_extensions((GLcontext *)c);
-
-    /* you probably have to do a bunch of other initializations here. */
-    c->visual = visual;
-
-    ((GLcontext *)c)->Driver.UpdateState = dmesa_update_state;
-
-    /* Initialize the software rasterizer and helper modules.
-     */
-    _swrast_CreateContext((GLcontext *)c);
-    _ac_CreateContext((GLcontext *)c);
-    _tnl_CreateContext((GLcontext *)c);
-    _swsetup_CreateContext((GLcontext *)c);
-    if (visual->rgb_flag) dmesa_register_swrast_functions((GLcontext *)c);
-    dmesa_init_pointers((GLcontext *)c);
- }
  TNLcontext *tnl;
  struct dd_function_table functions;
+
  if ((c=(GLcontext *)CALLOC_STRUCT(dmesa_context)) != NULL) {
+      /* Initialize device driver function table */
+      _mesa_init_driver_functions(&functions);
+      /* override with our functions */
+      dmesa_init_driver_functions(visual, &functions);
+
+      _mesa_initialize_context(c,
+                               (GLvisual *)visual,
+                               (GLcontext *)share,
+                               &functions,
+                               (void *)c);
+      _mesa_enable_sw_extensions(c);
+      _mesa_enable_1_3_extensions(c);
+      _mesa_enable_1_4_extensions(c);
+      _mesa_enable_1_5_extensions(c);
+      _mesa_enable_2_0_extensions(c);
+#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
 
- return c;
+      /* you probably have to do a bunch of other initializations here. */
+      ((DMesaContext)c)->visual = visual;
+
+      /* Initialize the software rasterizer and helper modules.
+       */
+      _swrast_CreateContext(c);
+      _ac_CreateContext(c);
+      _tnl_CreateContext(c);
+      _swsetup_CreateContext(c);
+      /* tnl setup */
+      tnl = TNL_CONTEXT(c);
+      tnl->Driver.RunPipeline = _tnl_run_pipeline;
+      /* swrast setup */
+      if (((GLvisual *)visual)->rgbMode) dmesa_register_swrast_functions(c);
+      dmesa_init_pointers(c);
+      _swsetup_Wakeup(c);
+   }
 
 #else  /* FX */
return (DMesaContext)visual;
  c = (GLcontext *)0xdeadbeef;
 #endif /* FX */
-}
 
+   return (DMesaContext)c;
+}
 
 
-void DMesaDestroyContext (DMesaContext c)
+void
+DMesaDestroyContext (DMesaContext c)
 {
 #ifndef FX
- if (c) {
-    _swsetup_DestroyContext((GLcontext *)c);
-    _swrast_DestroyContext((GLcontext *)c);
-    _tnl_DestroyContext((GLcontext *)c);
-    _ac_DestroyContext((GLcontext *)c);
-    _mesa_destroy_context((GLcontext *)c);
- }
  if (c) {
+      _swsetup_DestroyContext((GLcontext *)c);
+      _swrast_DestroyContext((GLcontext *)c);
+      _tnl_DestroyContext((GLcontext *)c);
+      _ac_DestroyContext((GLcontext *)c);
+      _mesa_destroy_context((GLcontext *)c);
  }
 #endif
 }
 
 
-
-GLboolean DMesaMoveBuffer (GLint xpos, GLint ypos)
+GLboolean
+DMesaMoveBuffer (GLint xpos, GLint ypos)
 {
-#if !defined(FX) && !defined(MATROX)
- GET_CURRENT_CONTEXT(ctx);
- DMesaBuffer b = ((DMesaContext)ctx)->Buffer;
-
- if (vl_sync_buffer(&b->the_window, xpos, ypos, b->width, b->height) != 0) {
-    return GL_FALSE;
- } else {
-    b->xpos = xpos;
-    b->ypos = ypos;
-    return GL_TRUE;
- }
-
-#else
- return GL_FALSE;
+#ifndef FX
+   GET_CURRENT_CONTEXT(ctx);
+   DMesaBuffer b = ((DMesaContext)ctx)->buffer;
+
+   if (vl_sync_buffer(&b->the_window, xpos, ypos, b->width, b->height) == 0) {
+      b->xpos = xpos;
+      b->ypos = ypos;
+      return GL_TRUE;
+   }
 #endif
-}
 
+   return GL_FALSE;
+}
 
 
-GLboolean DMesaResizeBuffer (GLint width, GLint height)
+GLboolean
+DMesaResizeBuffer (GLint width, GLint height)
 {
-#if !defined(FX) && !defined(MATROX)
- GET_CURRENT_CONTEXT(ctx);
- DMesaBuffer b = ((DMesaContext)ctx)->Buffer;
-
- if (vl_sync_buffer(&b->the_window, b->xpos, b->ypos, width, height) != 0) {
-    return GL_FALSE;
- } else {
-    b->width = width;
-    b->height = height;
-    return GL_TRUE;
- }
-
-#else
- return GL_FALSE;
+#ifndef FX
+   GET_CURRENT_CONTEXT(ctx);
+   DMesaBuffer b = ((DMesaContext)ctx)->buffer;
+
+   if (vl_sync_buffer(&b->the_window, b->xpos, b->ypos, width, height) == 0) {
+      b->width = width;
+      b->height = height;
+      return GL_TRUE;
+   }
 #endif
-}
 
+   return GL_FALSE;
+}
 
 
 /*
  * Make the specified context and buffer the current one.
  */
-GLboolean DMesaMakeCurrent (DMesaContext c, DMesaBuffer b)
+GLboolean
+DMesaMakeCurrent (DMesaContext c, DMesaBuffer b)
 {
 #ifndef FX
- if ((c != NULL) && (b != NULL)) {
-#ifndef MATROX
-    if (vl_sync_buffer(&b->the_window, b->xpos, b->ypos, b->width, b->height) != 0) {
-       return GL_FALSE;
-    }
-#endif
+   if ((c != NULL) && (b != NULL)) {
+      if (vl_sync_buffer(&b->the_window, b->xpos, b->ypos, b->width, b->height) != 0) {
+         return GL_FALSE;
+      }
 
-    c->Buffer = b;
+      c->buffer = b;
 
-    _mesa_make_current((GLcontext *)c, (GLframebuffer *)b);
-    if (((GLcontext *)c)->Viewport.Width == 0) {
-       /* initialize viewport to window size */
-       _mesa_Viewport(0, 0, b->width, b->height);
-    }
- } else {
-    /* Detach */
-    _mesa_make_current(NULL, NULL);
- }
+      _mesa_make_current((GLcontext *)c, (GLframebuffer *)b);
+   }
+   else {
+      /* Detach */
+      _mesa_make_current(NULL, NULL);
+   }
 
 #else
fxMesaMakeCurrent((fxMesaContext)c);
  fxMesaMakeCurrent((fxMesaContext)b);
 #endif
 
- return GL_TRUE;
  return GL_TRUE;
 }
 
 
-
-void DMesaSwapBuffers (DMesaBuffer b)
+void
+DMesaSwapBuffers (DMesaBuffer b)
 {
- /* copy/swap back buffer to front if applicable */
  /* copy/swap back buffer to front if applicable */
 #ifndef FX
- GET_CURRENT_CONTEXT(ctx);
- _mesa_notifySwapBuffers(ctx);
-#ifndef MATROX
- vl_flip();
-#else
- if (((DMesaContext)ctx)->visual->db_flag) {
-    mga_swapbuffers(1);
- }
-#endif
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_notifySwapBuffers(ctx);
+   vl_flip();
 #else
- fxMesaSwapBuffers();
  fxMesaSwapBuffers();
 #endif
 }
 
 
-
-void DMesaSetCI (int ndx, GLfloat red, GLfloat green, GLfloat blue)
+void
+DMesaSetCI (int ndx, GLfloat red, GLfloat green, GLfloat blue)
 {
-#if !defined(FX) && !defined(MATROX)
- vl_setCI(ndx, red, green, blue);
+#ifndef FX
  vl_setCI(ndx, red, green, blue);
 #endif
 }
 
 
-
-DMesaContext DMesaGetCurrentContext (void)
+DMesaContext
+DMesaGetCurrentContext (void)
 {
+   GET_CURRENT_CONTEXT(ctx);
+
 #ifndef FX
- GET_CURRENT_CONTEXT(ctx);
- return (DMesaContext)ctx;
 #else
- return (DMesaContext)fxMesaGetCurrentContext();
+   if (ctx != NULL) {
+      ctx = (GLcontext *)0xdeadbeef;
+   }
 #endif
-}
 
+   return (DMesaContext)ctx;
+}
 
 
-int DMesaGetIntegerv (GLenum pname, GLint *params)
+DMesaBuffer
+DMesaGetCurrentBuffer (void)
 {
+   const DMesaContext dmesa = DMesaGetCurrentContext();
+
+   if (dmesa == NULL) {
+      return NULL;
+   }
+
 #ifndef FX
- GET_CURRENT_CONTEXT(ctx);
- const DMesaContext c = (DMesaContext)ctx;
+   return dmesa->buffer;
 #else
const fxMesaContext c = fxMesaGetCurrentContext();
  return (DMesaBuffer)fxMesaGetCurrentContext();
 #endif
+}
+
 
- if (c == NULL) {
-    return -1;
- }
-
- switch (pname) {
-        case DMESA_GET_SCREEN_SIZE:
-             #ifndef FX
-             #ifndef MATROX
-             vl_get(VL_GET_SCREEN_SIZE, params);
-             #else
-             mga_get(MGA_GET_SCREEN_SIZE, params);
-             #endif
-             #else
-             params[0] = c->screen_width;
-             params[1] = c->screen_height;
-             #endif
-             break;
-        case DMESA_GET_DRIVER_CAPS:
-             #ifndef FX
-             #ifndef MATROX
-             params[0] = DMESA_DRIVER_SWDB_BIT;
-             #else
-             params[0] = 0;
-             #endif
-             #else
-             params[0] = DMESA_DRIVER_LLWO_BIT;
-             #endif
-             break;
-        default:
-             return -1;
- }
-
- return 0;
+DMesaProc
+DMesaGetProcAddress (const char *name)
+{
+   DMesaProc p = (DMesaProc)_glapi_get_proc_address(name);
+
+   /* TODO: handle DMesa* namespace
+   if (p == NULL) {
+   }
+   */
+
+   return p;
+}
+
+
+int
+DMesaGetIntegerv (GLenum pname, GLint *params)
+{
+   switch (pname) {
+      case DMESA_GET_SCREEN_SIZE:
+         #ifndef FX
+         vl_get(VL_GET_SCREEN_SIZE, params);
+         #else
+         fxGetScreenGeometry(&params[0], &params[1]);
+         #endif
+         break;
+      case DMESA_GET_DRIVER_CAPS:
+         #ifndef FX
+         params[0] = DMESA_DRIVER_SWDB_BIT;
+         #else
+         params[0] = DMESA_DRIVER_LLWO_BIT;
+         #endif
+         break;
+      case DMESA_GET_VIDEO_MODES:
+         #ifndef FX
+         return vl_get(VL_GET_VIDEO_MODES, params);
+         #else
+         return -1; /* TODO */
+         #endif
+      case DMESA_GET_BUFFER_ADDR: {
+         #ifndef FX
+         DMesaContext c = (DMesaContext)DMesaGetCurrentContext();
+         if (c != NULL) {
+            DMesaBuffer b = c->buffer;
+            if (b != NULL) {
+               params[0] = (GLint)b->the_window;
+            }
+         }
+         break;
+         #else
+         return -1;
+         #endif
+      }
+      default:
+         return -1;
+   }
+
+   return 0;
 }
+
+
+#if SWTC && (((__DJGPP__ << 8) | __DJGPP_MINOR__) >= 0x204)
+#include <sys/dxe.h>
+
+extern_asm(___dj_assert);
+extern_asm(_free);
+extern_asm(_malloc);
+extern_asm(_memset);
+
+DXE_EXPORT_TABLE_AUTO (___dxe_eta___dxtn)
+   DXE_EXPORT_ASM (___dj_assert)
+   DXE_EXPORT_ASM (_free)
+   DXE_EXPORT_ASM (_malloc)
+   DXE_EXPORT_ASM (_memset)
+DXE_EXPORT_END
+#endif