fix GL_BACK color material bug
[mesa.git] / src / mesa / main / context.c
index 5645026761fb0af42158726d5e89e600479c8ba9..1fa5fb838134a06fa1de247a821db9b8e24c35d5 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: context.c,v 1.32 2000/01/17 20:00:15 brianp Exp $ */
+/* $Id: context.c,v 1.70 2000/05/26 14:44:59 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
 #include "accum.h"
 #include "alphabuf.h"
 #include "clip.h"
+#include "colortab.h"
 #include "context.h"
 #include "cva.h"
 #include "depth.h"
-#include "dispatch.h"
 #include "dlist.h"
 #include "eval.h"
 #include "enums.h"
 #include "fog.h"
 #include "get.h"
 #include "glapi.h"
+#include "glapinoop.h"
+#include "glthread.h"
 #include "hash.h"
 #include "light.h"
-#include "lines.h"
-#include "dlist.h"
 #include "macros.h"
 #include "matrix.h"
 #include "mem.h"
 #include "mmath.h"
 #include "pb.h"
 #include "pipeline.h"
-#include "points.h"
-#include "quads.h"
 #include "shade.h"
 #include "simple_list.h"
 #include "stencil.h"
 #include "stages.h"
-#include "triangle.h"
+#include "state.h"
 #include "translate.h"
 #include "teximage.h"
 #include "texobj.h"
@@ -69,7 +67,6 @@
 #include "varray.h"
 #include "vb.h"
 #include "vbcull.h"
-#include "vbfill.h"
 #include "vbrender.h"
 #include "vbxform.h"
 #include "vertices.h"
 
 #if !defined(THREADS)
 
-struct immediate *CURRENT_INPUT = NULL;
+struct immediate *_mesa_CurrentInput = NULL;
 
 #endif
 
 
-
-
 /**********************************************************************/
-/*****                   Profiling functions                      *****/
+/***** GL Visual allocation/destruction                           *****/
 /**********************************************************************/
 
-#ifdef PROFILE
-
-#include <sys/times.h>
-#include <sys/param.h>
-
 
 /*
- * Return system time in seconds.
- * NOTE:  this implementation may not be very portable!
+ * Allocate a new GLvisual object.
+ * Input:  rgbFlag - GL_TRUE=RGB(A) mode, GL_FALSE=Color Index mode
+ *         dbFlag - double buffering?
+ *         stereoFlag - stereo buffer?
+ *         depthBits - requested bits per depth buffer value
+ *                     Any value in [0, 32] is acceptable but the actual
+ *                     depth type will be GLushort or GLuint as needed.
+ *         stencilBits - requested minimum bits per stencil buffer value
+ *         accumBits - requested minimum bits per accum buffer component
+ *         indexBits - number of bits per pixel if rgbFlag==GL_FALSE
+ *         red/green/blue/alphaBits - number of bits per color component
+ *                                    in frame buffer for RGB(A) mode.
+ *                                    We always use 8 in core Mesa though.
+ * Return:  pointer to new GLvisual or NULL if requested parameters can't
+ *          be met.
  */
-GLdouble gl_time( void )
+GLvisual *
+_mesa_create_visual( GLboolean rgbFlag,
+                     GLboolean dbFlag,
+                     GLboolean stereoFlag,
+                     GLint redBits,
+                     GLint greenBits,
+                     GLint blueBits,
+                     GLint alphaBits,
+                     GLint indexBits,
+                     GLint depthBits,
+                     GLint stencilBits,
+                     GLint accumRedBits,
+                     GLint accumGreenBits,
+                     GLint accumBlueBits,
+                     GLint accumAlphaBits,
+                     GLint numSamples )
 {
-   static GLdouble prev_time = 0.0;
-   static GLdouble time;
-   struct tms tm;
-   clock_t clk;
-
-   clk = times(&tm);
-
-#ifdef CLK_TCK
-   time = (double)clk / (double)CLK_TCK;
-#else
-   time = (double)clk / (double)HZ;
-#endif
-
-   if (time>prev_time) {
-      prev_time = time;
-      return time;
-   }
-   else {
-      return prev_time;
+   GLvisual *vis = (GLvisual *) CALLOC( sizeof(GLvisual) );
+   if (vis) {
+      if (!_mesa_initialize_visual(vis, rgbFlag, dbFlag, stereoFlag,
+                                   redBits, greenBits, blueBits, alphaBits,
+                                   indexBits, depthBits, stencilBits,
+                                   accumRedBits, accumGreenBits,
+                                   accumBlueBits, accumAlphaBits,
+                                   numSamples )) {
+         FREE(vis);
+         return NULL;
+      }
    }
+   return vis;
 }
 
+
 /*
- * Reset the timing/profiling counters
+ * Initialize the fields of the given GLvisual.
+ * Input:  see _mesa_create_visual() above.
+ * Return: GL_TRUE = success
+ *         GL_FALSE = failure.
  */
-static void init_timings( GLcontext *ctx )
+GLboolean
+_mesa_initialize_visual( GLvisual *vis,
+                         GLboolean rgbFlag,
+                         GLboolean dbFlag,
+                         GLboolean stereoFlag,
+                         GLint redBits,
+                         GLint greenBits,
+                         GLint blueBits,
+                         GLint alphaBits,
+                         GLint indexBits,
+                         GLint depthBits,
+                         GLint stencilBits,
+                         GLint accumRedBits,
+                         GLint accumGreenBits,
+                         GLint accumBlueBits,
+                         GLint accumAlphaBits,
+                         GLint numSamples )
 {
-   ctx->BeginEndCount = 0;
-   ctx->BeginEndTime = 0.0;
-   ctx->VertexCount = 0;
-   ctx->VertexTime = 0.0;
-   ctx->PointCount = 0;
-   ctx->PointTime = 0.0;
-   ctx->LineCount = 0;
-   ctx->LineTime = 0.0;
-   ctx->PolygonCount = 0;
-   ctx->PolygonTime = 0.0;
-   ctx->ClearCount = 0;
-   ctx->ClearTime = 0.0;
-   ctx->SwapCount = 0;
-   ctx->SwapTime = 0.0;
-}
+   assert(vis);
 
+   /* This is to catch bad values from device drivers not updated for
+    * Mesa 3.3.  Some device drivers just passed 1.  That's a REALLY
+    * bad value now (a 1-bit depth buffer!?!).
+    */
+   assert(depthBits == 0 || depthBits > 1);
 
-/*
- * Print the accumulated timing/profiling data.
- */
-static void print_timings( GLcontext *ctx )
-{
-   GLdouble beginendrate;
-   GLdouble vertexrate;
-   GLdouble pointrate;
-   GLdouble linerate;
-   GLdouble polygonrate;
-   GLdouble overhead;
-   GLdouble clearrate;
-   GLdouble swaprate;
-   GLdouble avgvertices;
-
-   if (ctx->BeginEndTime>0.0) {
-      beginendrate = ctx->BeginEndCount / ctx->BeginEndTime;
-   }
-   else {
-      beginendrate = 0.0;
-   }
-   if (ctx->VertexTime>0.0) {
-      vertexrate = ctx->VertexCount / ctx->VertexTime;
-   }
-   else {
-      vertexrate = 0.0;
-   }
-   if (ctx->PointTime>0.0) {
-      pointrate = ctx->PointCount / ctx->PointTime;
-   }
-   else {
-      pointrate = 0.0;
-   }
-   if (ctx->LineTime>0.0) {
-      linerate = ctx->LineCount / ctx->LineTime;
-   }
-   else {
-      linerate = 0.0;
-   }
-   if (ctx->PolygonTime>0.0) {
-      polygonrate = ctx->PolygonCount / ctx->PolygonTime;
-   }
-   else {
-      polygonrate = 0.0;
-   }
-   if (ctx->ClearTime>0.0) {
-      clearrate = ctx->ClearCount / ctx->ClearTime;
-   }
-   else {
-      clearrate = 0.0;
-   }
-   if (ctx->SwapTime>0.0) {
-      swaprate = ctx->SwapCount / ctx->SwapTime;
-   }
-   else {
-      swaprate = 0.0;
+   if (depthBits < 0 || depthBits > 32) {
+      return GL_FALSE;
    }
-
-   if (ctx->BeginEndCount>0) {
-      avgvertices = (GLdouble) ctx->VertexCount / (GLdouble) ctx->BeginEndCount;
+   if (stencilBits < 0 || stencilBits > (GLint) (8 * sizeof(GLstencil))) {
+      return GL_FALSE;
    }
-   else {
-      avgvertices = 0.0;
-   }
-
-   overhead = ctx->BeginEndTime - ctx->VertexTime - ctx->PointTime
-              - ctx->LineTime - ctx->PolygonTime;
-
-
-   printf("                          Count   Time (s)    Rate (/s) \n");
-   printf("--------------------------------------------------------\n");
-   printf("glBegin/glEnd           %7d  %8.3f   %10.3f\n",
-          ctx->BeginEndCount, ctx->BeginEndTime, beginendrate);
-   printf("  vertexes transformed  %7d  %8.3f   %10.3f\n",
-          ctx->VertexCount, ctx->VertexTime, vertexrate );
-   printf("  points rasterized     %7d  %8.3f   %10.3f\n",
-          ctx->PointCount, ctx->PointTime, pointrate );
-   printf("  lines rasterized      %7d  %8.3f   %10.3f\n",
-          ctx->LineCount, ctx->LineTime, linerate );
-   printf("  polygons rasterized   %7d  %8.3f   %10.3f\n",
-          ctx->PolygonCount, ctx->PolygonTime, polygonrate );
-   printf("  overhead                       %8.3f\n", overhead );
-   printf("glClear                 %7d  %8.3f   %10.3f\n",
-          ctx->ClearCount, ctx->ClearTime, clearrate );
-   printf("SwapBuffers             %7d  %8.3f   %10.3f\n",
-          ctx->SwapCount, ctx->SwapTime, swaprate );
-   printf("\n");
-
-   printf("Average number of vertices per begin/end: %8.3f\n", avgvertices );
-}
-#endif
-
-
-
-
-
-/**********************************************************************/
-/***** GL Visual allocation/destruction                           *****/
-/**********************************************************************/
-
-
-/*
- * Allocate a new GLvisual object.
- * Input:  rgbFlag - GL_TRUE=RGB(A) mode, GL_FALSE=Color Index mode
- *         alphaFlag - alloc software alpha buffers?
- *         dbFlag - double buffering?
- *         stereoFlag - stereo buffer?
- *         depthFits - requested minimum bits per depth buffer value
- *         stencilFits - requested minimum bits per stencil buffer value
- *         accumFits - requested minimum bits per accum buffer component
- *         indexFits - number of bits per pixel if rgbFlag==GL_FALSE
- *         red/green/blue/alphaFits - number of bits per color component
- *                                     in frame buffer for RGB(A) mode.
- * Return:  pointer to new GLvisual or NULL if requested parameters can't
- *          be met.
- */
-GLvisual *gl_create_visual( GLboolean rgbFlag,
-                            GLboolean alphaFlag,
-                            GLboolean dbFlag,
-                            GLboolean stereoFlag,
-                            GLint depthBits,
-                            GLint stencilBits,
-                            GLint accumBits,
-                            GLint indexBits,
-                            GLint redBits,
-                            GLint greenBits,
-                            GLint blueBits,
-                            GLint alphaBits )
-{
-   GLvisual *vis;
-
-   if (depthBits > (GLint) (8*sizeof(GLdepth))) {
-      /* can't meet depth buffer requirements */
-      return NULL;
+   if (accumRedBits < 0 || accumRedBits > (GLint) (8 * sizeof(GLaccum))) {
+      return GL_FALSE;
    }
-   if (stencilBits > (GLint) (8*sizeof(GLstencil))) {
-      /* can't meet stencil buffer requirements */
-      return NULL;
+   if (accumGreenBits < 0 || accumGreenBits > (GLint) (8 * sizeof(GLaccum))) {
+      return GL_FALSE;
    }
-   if (accumBits > (GLint) (8*sizeof(GLaccum))) {
-      /* can't meet accum buffer requirements */
-      return NULL;
+   if (accumBlueBits < 0 || accumBlueBits > (GLint) (8 * sizeof(GLaccum))) {
+      return GL_FALSE;
    }
-
-   vis = (GLvisual *) CALLOC( sizeof(GLvisual) );
-   if (!vis) {
-      return NULL;
+   if (accumAlphaBits < 0 || accumAlphaBits > (GLint) (8 * sizeof(GLaccum))) {
+      return GL_FALSE;
    }
 
    vis->RGBAflag   = rgbFlag;
@@ -307,23 +199,75 @@ GLvisual *gl_create_visual( GLboolean rgbFlag,
    vis->RedBits    = redBits;
    vis->GreenBits  = greenBits;
    vis->BlueBits   = blueBits;
-   vis->AlphaBits  = alphaFlag ? 8*sizeof(GLubyte) : alphaBits;
+   vis->AlphaBits  = alphaBits;
+
+   vis->IndexBits      = indexBits;
+   vis->DepthBits      = depthBits;
+   vis->AccumRedBits   = (accumRedBits > 0) ? (8 * sizeof(GLaccum)) : 0;
+   vis->AccumGreenBits = (accumGreenBits > 0) ? (8 * sizeof(GLaccum)) : 0;
+   vis->AccumBlueBits  = (accumBlueBits > 0) ? (8 * sizeof(GLaccum)) : 0;
+   vis->AccumAlphaBits = (accumAlphaBits > 0) ? (8 * sizeof(GLaccum)) : 0;
+   vis->StencilBits    = (stencilBits > 0) ? (8 * sizeof(GLstencil)) : 0;
+
+   if (depthBits == 0) {
+      /* Special case.  Even if we don't have a depth buffer we need
+       * good values for DepthMax for Z vertex transformation purposes.
+       */
+      vis->DepthMax = 1;
+      vis->DepthMaxF = 1.0F;
+   }
+   else if (depthBits < 32) {
+      vis->DepthMax = (1 << depthBits) - 1;
+      vis->DepthMaxF = (GLfloat) vis->DepthMax;
+   }
+   else {
+      /* Special case since shift values greater than or equal to the
+       * number of bits in the left hand expression's type are
+       * undefined.
+       */
+      vis->DepthMax = 0xffffffff;
+      vis->DepthMaxF = (GLfloat) vis->DepthMax;
+   }
 
-   vis->IndexBits   = indexBits;
-   vis->DepthBits   = (depthBits>0) ? 8*sizeof(GLdepth) : 0;
-   vis->AccumBits   = (accumBits>0) ? 8*sizeof(GLaccum) : 0;
-   vis->StencilBits = (stencilBits>0) ? 8*sizeof(GLstencil) : 0;
+   return GL_TRUE;
+}
 
-   vis->SoftwareAlpha = alphaFlag;
 
-   return vis;
+/* This function should no longer be used. Use _mesa_create_visual() instead */
+GLvisual *
+gl_create_visual( GLboolean rgbFlag,
+                  GLboolean alphaFlag,
+                  GLboolean dbFlag,
+                  GLboolean stereoFlag,
+                  GLint depthBits,
+                  GLint stencilBits,
+                  GLint accumBits,
+                  GLint indexBits,
+                  GLint redBits,
+                  GLint greenBits,
+                  GLint blueBits,
+                  GLint alphaBits )
+{
+   (void) alphaFlag;
+   return _mesa_create_visual(rgbFlag, dbFlag, stereoFlag,
+                              redBits, greenBits, blueBits, alphaBits,
+                              indexBits, depthBits, stencilBits,
+                              accumBits, accumBits, accumBits, accumBits, 0);
 }
 
 
+void
+_mesa_destroy_visual( GLvisual *vis )
+{
+   FREE(vis);
+}
+
 
-void gl_destroy_visual( GLvisual *vis )
+/* obsolete */
+void
+gl_destroy_visual( GLvisual *vis )
 {
-   FREE( vis );
+   _mesa_destroy_visual(vis);
 }
 
 
@@ -345,18 +289,38 @@ void gl_destroy_visual( GLvisual *vis )
 
  * Return:  pointer to new GLframebuffer struct or NULL if error.
  */
-GLframebuffer *gl_create_framebuffer( GLvisual *visual,
-                                      GLboolean softwareDepth,
-                                      GLboolean softwareStencil,
-                                      GLboolean softwareAccum,
-                                      GLboolean softwareAlpha )
+GLframebuffer *
+gl_create_framebuffer( GLvisual *visual,
+                       GLboolean softwareDepth,
+                       GLboolean softwareStencil,
+                       GLboolean softwareAccum,
+                       GLboolean softwareAlpha )
 {
-   GLframebuffer *buffer;
-
-   buffer = CALLOC_STRUCT(gl_frame_buffer);
-   if (!buffer) {
-      return NULL;
+   GLframebuffer *buffer = CALLOC_STRUCT(gl_frame_buffer);
+   assert(visual);
+   if (buffer) {
+      _mesa_initialize_framebuffer(buffer, visual,
+                                   softwareDepth, softwareStencil,
+                                   softwareAccum, softwareAlpha );
    }
+   return buffer;
+}
+
+
+/*
+ * Initialize a GLframebuffer object.
+ * Input:  See gl_create_framebuffer() above.
+ */
+void
+_mesa_initialize_framebuffer( GLframebuffer *buffer,
+                              GLvisual *visual,
+                              GLboolean softwareDepth,
+                              GLboolean softwareStencil,
+                              GLboolean softwareAccum,
+                              GLboolean softwareAlpha )
+{
+   assert(buffer);
+   assert(visual);
 
    /* sanity checks */
    if (softwareDepth ) {
@@ -367,7 +331,9 @@ GLframebuffer *gl_create_framebuffer( GLvisual *visual,
    }
    if (softwareAccum) {
       assert(visual->RGBAflag);
-      assert(visual->AccumBits > 0);
+      assert(visual->AccumRedBits > 0);
+      assert(visual->AccumGreenBits > 0);
+      assert(visual->AccumBlueBits > 0);
    }
    if (softwareAlpha) {
       assert(visual->RGBAflag);
@@ -379,20 +345,18 @@ GLframebuffer *gl_create_framebuffer( GLvisual *visual,
    buffer->UseSoftwareStencilBuffer = softwareStencil;
    buffer->UseSoftwareAccumBuffer = softwareAccum;
    buffer->UseSoftwareAlphaBuffers = softwareAlpha;
-
-   return buffer;
 }
 
 
-
 /*
  * Free a framebuffer struct and its buffers.
  */
-void gl_destroy_framebuffer( GLframebuffer *buffer )
+void
+gl_destroy_framebuffer( GLframebuffer *buffer )
 {
    if (buffer) {
-      if (buffer->Depth) {
-         FREE( buffer->Depth );
+      if (buffer->DepthBuffer) {
+         FREE( buffer->DepthBuffer );
       }
       if (buffer->Accum) {
          FREE( buffer->Accum );
@@ -423,12 +387,17 @@ void gl_destroy_framebuffer( GLframebuffer *buffer )
 /**********************************************************************/
 
 
+_glthread_DECLARE_STATIC_MUTEX(OneTimeLock);
+
+
 /*
  * This function just calls all the various one-time-init functions in Mesa.
  */
-static void one_time_init( void )
+static void
+one_time_init( void )
 {
    static GLboolean alreadyCalled = GL_FALSE;
+   _glthread_LOCK_MUTEX(OneTimeLock);
    if (!alreadyCalled) {
       /* do some implementation tests */
       assert( sizeof(GLbyte) == 1 );
@@ -440,8 +409,8 @@ static void one_time_init( void )
 
       gl_init_clip();
       gl_init_eval();
-      gl_init_fog();
-      gl_init_math();
+      _mesa_init_fog();
+      _mesa_init_math();
       gl_init_lists();
       gl_init_shade();
       gl_init_texture();
@@ -450,11 +419,21 @@ static void one_time_init( void )
       gl_init_vbrender();
       gl_init_vbxform();
       gl_init_vertices();
-      alreadyCalled = GL_TRUE;
-   }
+
+      if (getenv("MESA_DEBUG")) {
+         _glapi_noop_enable_warnings(GL_TRUE);
+      }
+      else {
+         _glapi_noop_enable_warnings(GL_FALSE);
+      }
+
 #if defined(DEBUG) && defined(__DATE__) && defined(__TIME__)
    fprintf(stderr, "Mesa DEBUG build %s %s\n", __DATE__, __TIME__);
 #endif
+
+      alreadyCalled = GL_TRUE;
+   }
+   _glthread_UNLOCK_MUTEX(OneTimeLock);
 }
 
 
@@ -462,7 +441,8 @@ static void one_time_init( void )
 /*
  * Allocate and initialize a shared context state structure.
  */
-static struct gl_shared_state *alloc_shared_state( void )
+static struct gl_shared_state *
+alloc_shared_state( void )
 {
    GLuint d;
    struct gl_shared_state *ss;
@@ -472,9 +452,9 @@ static struct gl_shared_state *alloc_shared_state( void )
    if (!ss)
       return NULL;
 
-   ss->DisplayList = NewHashTable();
+   ss->DisplayList = _mesa_NewHashTable();
 
-   ss->TexObjects = NewHashTable();
+   ss->TexObjects = _mesa_NewHashTable();
 
    /* Default Texture objects */
    outOfMemory = GL_FALSE;
@@ -487,18 +467,28 @@ static struct gl_shared_state *alloc_shared_state( void )
       ss->DefaultD[d]->RefCount++; /* don't free if not in use */
    }
 
+   ss->DefaultCubeMap = gl_alloc_texture_object(ss, 0, 6);
+   if (!ss->DefaultCubeMap) {
+      outOfMemory = GL_TRUE;
+   }
+   else {
+      ss->DefaultCubeMap->RefCount++;
+   }
+
    if (!ss->DisplayList || !ss->TexObjects || outOfMemory) {
       /* Ran out of memory at some point.  Free everything and return NULL */
       if (ss->DisplayList)
-         DeleteHashTable(ss->DisplayList);
+         _mesa_DeleteHashTable(ss->DisplayList);
       if (ss->TexObjects)
-         DeleteHashTable(ss->TexObjects);
+         _mesa_DeleteHashTable(ss->TexObjects);
       if (ss->DefaultD[1])
          gl_free_texture_object(ss, ss->DefaultD[1]);
       if (ss->DefaultD[2])
          gl_free_texture_object(ss, ss->DefaultD[2]);
       if (ss->DefaultD[3])
          gl_free_texture_object(ss, ss->DefaultD[3]);
+      if (ss->DefaultCubeMap)
+         gl_free_texture_object(ss, ss->DefaultCubeMap);
       FREE(ss);
       return NULL;
    }
@@ -511,11 +501,12 @@ static struct gl_shared_state *alloc_shared_state( void )
 /*
  * Deallocate a shared state context and all children structures.
  */
-static void free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
+static void
+free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
 {
    /* Free display lists */
    while (1) {
-      GLuint list = HashFirstEntry(ss->DisplayList);
+      GLuint list = _mesa_HashFirstEntry(ss->DisplayList);
       if (list) {
          gl_destroy_list(ctx, list);
       }
@@ -523,7 +514,7 @@ static void free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
          break;
       }
    }
-   DeleteHashTable(ss->DisplayList);
+   _mesa_DeleteHashTable(ss->DisplayList);
 
    /* Free texture objects */
    while (ss->TexObjectList)
@@ -533,7 +524,7 @@ static void free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
       /* this function removes from linked list too! */
       gl_free_texture_object(ss, ss->TexObjectList);
    }
-   DeleteHashTable(ss->TexObjects);
+   _mesa_DeleteHashTable(ss->TexObjects);
 
    FREE(ss);
 }
@@ -544,7 +535,8 @@ static void free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
  * Initialize the nth light.  Note that the defaults for light 0 are
  * different than the other lights.
  */
-static void init_light( struct gl_light *l, GLuint n )
+static void
+init_light( struct gl_light *l, GLuint n )
 {
    make_empty_list( l );
 
@@ -571,7 +563,8 @@ static void init_light( struct gl_light *l, GLuint n )
 
 
 
-static void init_lightmodel( struct gl_lightmodel *lm )
+static void
+init_lightmodel( struct gl_lightmodel *lm )
 {
    ASSIGN_4V( lm->Ambient, 0.2, 0.2, 0.2, 1.0 );
    lm->LocalViewer = GL_FALSE;
@@ -580,7 +573,8 @@ static void init_lightmodel( struct gl_lightmodel *lm )
 }
 
 
-static void init_material( struct gl_material *m )
+static void
+init_material( struct gl_material *m )
 {
    ASSIGN_4V( m->Ambient,  0.2, 0.2, 0.2, 1.0 );
    ASSIGN_4V( m->Diffuse,  0.8, 0.8, 0.8, 1.0 );
@@ -594,7 +588,8 @@ static void init_material( struct gl_material *m )
 
 
 
-static void init_texture_unit( GLcontext *ctx, GLuint unit )
+static void
+init_texture_unit( GLcontext *ctx, GLuint unit )
 {
    struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
 
@@ -618,10 +613,12 @@ static void init_texture_unit( GLcontext *ctx, GLuint unit )
    texUnit->CurrentD[1] = ctx->Shared->DefaultD[1];
    texUnit->CurrentD[2] = ctx->Shared->DefaultD[2];
    texUnit->CurrentD[3] = ctx->Shared->DefaultD[3];
+   texUnit->CurrentCubeMap = ctx->Shared->DefaultCubeMap;
 }
 
 
-static void init_fallback_arrays( GLcontext *ctx )
+static void
+init_fallback_arrays( GLcontext *ctx )
 {
    struct gl_client_array *cl;
    GLuint i;
@@ -671,7 +668,8 @@ static void init_fallback_arrays( GLcontext *ctx )
 
 
 /* Initialize a 1-D evaluator map */
-static void init_1d_map( struct gl_1d_map *map, int n, const float *initial )
+static void
+init_1d_map( struct gl_1d_map *map, int n, const float *initial )
 {
    map->Order = 1;
    map->u1 = 0.0;
@@ -686,7 +684,8 @@ static void init_1d_map( struct gl_1d_map *map, int n, const float *initial )
 
 
 /* Initialize a 2-D evaluator map */
-static void init_2d_map( struct gl_2d_map *map, int n, const float *initial )
+static void
+init_2d_map( struct gl_2d_map *map, int n, const float *initial )
 {
    map->Uorder = 1;
    map->Vorder = 1;
@@ -703,39 +702,45 @@ static void init_2d_map( struct gl_2d_map *map, int n, const float *initial )
 }
 
 
-static void init_color_table( struct gl_color_table *p )
-{
-   p->Table[0] = 255;
-   p->Table[1] = 255;
-   p->Table[2] = 255;
-   p->Table[3] = 255;
-   p->Size = 1;
-   p->IntFormat = GL_RGBA;
-   p->Format = GL_RGBA;
-}
-
-
 /*
  * Initialize the attribute groups in a GLcontext.
  */
-static void init_attrib_groups( GLcontext *ctx )
+static void
+init_attrib_groups( GLcontext *ctx )
 {
    GLuint i, j;
 
    assert(ctx);
 
-   /* Constants, may be overriden by device driver */
+   /* Constants, may be overriden by device drivers */
    ctx->Const.MaxTextureLevels = MAX_TEXTURE_LEVELS;
    ctx->Const.MaxTextureSize = 1 << (MAX_TEXTURE_LEVELS - 1);
+   ctx->Const.MaxCubeTextureSize = ctx->Const.MaxTextureSize;
    ctx->Const.MaxTextureUnits = MAX_TEXTURE_UNITS;
    ctx->Const.MaxArrayLockSize = MAX_ARRAY_LOCK_SIZE;
+   ctx->Const.SubPixelBits = SUB_PIXEL_BITS;
+   ctx->Const.MinPointSize = MIN_POINT_SIZE;
+   ctx->Const.MaxPointSize = MAX_POINT_SIZE;
+   ctx->Const.MinPointSizeAA = MIN_POINT_SIZE;
+   ctx->Const.MaxPointSizeAA = MAX_POINT_SIZE;
+   ctx->Const.PointSizeGranularity = POINT_SIZE_GRANULARITY;
+   ctx->Const.MinLineWidth = MIN_LINE_WIDTH;
+   ctx->Const.MaxLineWidth = MAX_LINE_WIDTH;
+   ctx->Const.MinLineWidthAA = MIN_LINE_WIDTH;
+   ctx->Const.MaxLineWidthAA = MAX_LINE_WIDTH;
+   ctx->Const.LineWidthGranularity = LINE_WIDTH_GRANULARITY;
+   ctx->Const.NumAuxBuffers = NUM_AUX_BUFFERS;
+   ctx->Const.MaxColorTableSize = MAX_COLOR_TABLE_SIZE;
+   ctx->Const.MaxConvolutionWidth = MAX_CONVOLUTION_WIDTH;
+   ctx->Const.MaxConvolutionHeight = MAX_CONVOLUTION_HEIGHT;
+   ctx->Const.NumCompressedTextureFormats = 0;
 
    /* Modelview matrix */
    gl_matrix_ctr( &ctx->ModelView );
    gl_matrix_alloc_inv( &ctx->ModelView );
 
    ctx->ModelViewStackDepth = 0;
-   for (i = 0 ; i < MAX_MODELVIEW_STACK_DEPTH ; i++) {
+   for (i = 0; i < MAX_MODELVIEW_STACK_DEPTH - 1; i++) {
       gl_matrix_ctr( &ctx->ModelViewStack[i] );
       gl_matrix_alloc_inv( &ctx->ModelViewStack[i] );
    }
@@ -752,7 +757,7 @@ static void init_attrib_groups( GLcontext *ctx )
    ctx->NearFarStack[0][0] = 1.0; /* These values seem weird by make */
    ctx->NearFarStack[0][1] = 0.0; /* sense mathematically. */
 
-   for (i = 0 ; i < MAX_PROJECTION_STACK_DEPTH ; i++) {
+   for (i = 0; i < MAX_PROJECTION_STACK_DEPTH - 1; i++) {
       gl_matrix_ctr( &ctx->ProjectionStack[i] );
       gl_matrix_alloc_inv( &ctx->ProjectionStack[i] );
    }
@@ -761,11 +766,18 @@ static void init_attrib_groups( GLcontext *ctx )
    for (i=0; i<MAX_TEXTURE_UNITS; i++) {
       gl_matrix_ctr( &ctx->TextureMatrix[i] );
       ctx->TextureStackDepth[i] = 0;
-      for (j = 0 ; j < MAX_TEXTURE_STACK_DEPTH ; j++) {
+      for (j = 0; j < MAX_TEXTURE_STACK_DEPTH - 1; j++) {
          ctx->TextureStack[i][j].inv = 0;
       }
    }
 
+   /* Color matrix */
+   gl_matrix_ctr(&ctx->ColorMatrix);
+   ctx->ColorStackDepth = 0;
+   for (j = 0; j < MAX_COLOR_STACK_DEPTH - 1; j++) {
+      gl_matrix_ctr(&ctx->ColorStack[j]);
+   }
+
    /* Accumulate buffer group */
    ASSIGN_4V( ctx->Accum.ClearColor, 0.0, 0.0, 0.0, 0.0 );
 
@@ -824,6 +836,7 @@ static void init_attrib_groups( GLcontext *ctx )
    ctx->Depth.Clear = 1.0;
    ctx->Depth.Func = GL_LESS;
    ctx->Depth.Mask = GL_TRUE;
+   ctx->Depth.OcclusionTest = GL_FALSE;
 
    /* Evaluators group */
    ctx->Eval.Map1Color4 = GL_FALSE;
@@ -899,11 +912,38 @@ static void init_attrib_groups( GLcontext *ctx )
    ctx->Hint.LineSmooth = GL_DONT_CARE;
    ctx->Hint.PolygonSmooth = GL_DONT_CARE;
    ctx->Hint.Fog = GL_DONT_CARE;
-
    ctx->Hint.AllowDrawWin = GL_TRUE;
-   ctx->Hint.AllowDrawSpn = GL_TRUE;
+   ctx->Hint.AllowDrawFrg = GL_TRUE;
    ctx->Hint.AllowDrawMem = GL_TRUE;
    ctx->Hint.StrictLighting = GL_TRUE;
+   ctx->Hint.ClipVolumeClipping = GL_DONT_CARE;
+   ctx->Hint.TextureCompression = GL_DONT_CARE;
+
+   /* Histogram group */
+   ctx->Histogram.Width = 0;
+   ctx->Histogram.Format = GL_RGBA;
+   ctx->Histogram.Sink = GL_FALSE;
+   ctx->Histogram.RedSize       = 0xffffffff;
+   ctx->Histogram.GreenSize     = 0xffffffff;
+   ctx->Histogram.BlueSize      = 0xffffffff;
+   ctx->Histogram.AlphaSize     = 0xffffffff;
+   ctx->Histogram.LuminanceSize = 0xffffffff;
+   for (i = 0; i < HISTOGRAM_TABLE_SIZE; i++) {
+      ctx->Histogram.Count[i][0] = 0;
+      ctx->Histogram.Count[i][1] = 0;
+      ctx->Histogram.Count[i][2] = 0;
+      ctx->Histogram.Count[i][3] = 0;
+   }
+
+   /* Min/Max group */
+   ctx->MinMax.Format = GL_RGBA;
+   ctx->MinMax.Sink = GL_FALSE;
+   ctx->MinMax.Min[RCOMP] = 1000;    ctx->MinMax.Max[RCOMP] = -1000;
+   ctx->MinMax.Min[GCOMP] = 1000;    ctx->MinMax.Max[GCOMP] = -1000;
+   ctx->MinMax.Min[BCOMP] = 1000;    ctx->MinMax.Max[BCOMP] = -1000;
+   ctx->MinMax.Min[ACOMP] = 1000;    ctx->MinMax.Max[ACOMP] = -1000;
+
+
 
    /* Pipeline */
    gl_pipeline_init( ctx );
@@ -1001,6 +1041,29 @@ static void init_attrib_groups( GLcontext *ctx )
    ctx->Pixel.MapGtoG[0] = 0.0;
    ctx->Pixel.MapBtoB[0] = 0.0;
    ctx->Pixel.MapAtoA[0] = 0.0;
+   ctx->Pixel.HistogramEnabled = GL_FALSE;
+   ctx->Pixel.MinMaxEnabled = GL_FALSE;
+   ctx->Pixel.PixelTextureEnabled = GL_FALSE;
+   ctx->Pixel.FragmentRgbSource = GL_PIXEL_GROUP_COLOR_SGIS;
+   ctx->Pixel.FragmentAlphaSource = GL_PIXEL_GROUP_COLOR_SGIS;
+   ASSIGN_4V(ctx->Pixel.PostColorMatrixScale, 1.0, 1.0, 1.0, 1.0);
+   ASSIGN_4V(ctx->Pixel.PostColorMatrixBias, 0.0, 0.0, 0.0, 0.0);
+   ASSIGN_4V(ctx->Pixel.ColorTableScale, 1.0, 1.0, 1.0, 1.0);
+   ASSIGN_4V(ctx->Pixel.ColorTableBias, 0.0, 0.0, 0.0, 0.0);
+   ctx->Pixel.ColorTableEnabled = GL_FALSE;
+   ctx->Pixel.PostConvolutionColorTableEnabled = GL_FALSE;
+   ctx->Pixel.PostColorMatrixColorTableEnabled = GL_FALSE;
+   ctx->Pixel.Convolution1DEnabled = GL_FALSE;
+   ctx->Pixel.Convolution2DEnabled = GL_FALSE;
+   ctx->Pixel.Separable2DEnabled = GL_FALSE;
+   for (i = 0; i < 3; i++) {
+      ASSIGN_4V(ctx->Pixel.ConvolutionBorderColor[i], 0.0, 0.0, 0.0, 0.0);
+      ctx->Pixel.ConvolutionBorderMode[i] = GL_REDUCE;
+      ASSIGN_4V(ctx->Pixel.ConvolutionFilterScale[i], 1.0, 1.0, 1.0, 1.0);
+      ASSIGN_4V(ctx->Pixel.ConvolutionFilterBias[i], 0.0, 0.0, 0.0, 0.0);
+   }
+   ASSIGN_4V(ctx->Pixel.PostConvolutionScale, 1.0, 1.0, 1.0, 1.0);
+   ASSIGN_4V(ctx->Pixel.PostConvolutionBias, 0.0, 0.0, 0.0, 0.0);
 
    /* Point group */
    ctx->Point.SmoothFlag = GL_FALSE;
@@ -1056,7 +1119,7 @@ static void init_attrib_groups( GLcontext *ctx )
    ctx->Texture.Enabled = 0;
    for (i=0; i<MAX_TEXTURE_UNITS; i++)
       init_texture_unit( ctx, i );
-   init_color_table(&ctx->Texture.Palette);
+   _mesa_init_colortable(&ctx->Texture.Palette);
 
    /* Transformation group */
    ctx->Transform.MatrixMode = GL_MODELVIEW;
@@ -1079,8 +1142,8 @@ static void init_attrib_groups( GLcontext *ctx )
 
 #define Sz 10
 #define Tz 14
-   ctx->Viewport.WindowMap.m[Sz] = 0.5 * DEPTH_SCALE;
-   ctx->Viewport.WindowMap.m[Tz] = 0.5 * DEPTH_SCALE;
+   ctx->Viewport.WindowMap.m[Sz] = 0.5 * ctx->Visual->DepthMaxF;
+   ctx->Viewport.WindowMap.m[Tz] = 0.5 * ctx->Visual->DepthMaxF;
 #undef Sz
 #undef Tz
 
@@ -1164,6 +1227,23 @@ static void init_attrib_groups( GLcontext *ctx )
    ctx->AttribStackDepth = 0;
    ctx->ClientAttribStackDepth = 0;
 
+   /* Display list */
+   ctx->CallDepth = 0;
+   ctx->ExecuteFlag = GL_TRUE;
+   ctx->CompileFlag = GL_FALSE;
+   ctx->CurrentListPtr = NULL;
+   ctx->CurrentBlock = NULL;
+   ctx->CurrentListNum = 0;
+   ctx->CurrentPos = 0;
+
+   /* Color tables */
+   _mesa_init_colortable(&ctx->ColorTable);
+   _mesa_init_colortable(&ctx->ProxyColorTable);
+   _mesa_init_colortable(&ctx->PostConvolutionColorTable);
+   _mesa_init_colortable(&ctx->ProxyPostConvolutionColorTable);
+   _mesa_init_colortable(&ctx->PostColorMatrixColorTable);
+   _mesa_init_colortable(&ctx->ProxyPostColorMatrixColorTable);
+
    /* Miscellaneous */
    ctx->NewState = NEW_ALL;
    ctx->RenderMode = GL_RENDER;
@@ -1175,18 +1255,11 @@ static void init_attrib_groups( GLcontext *ctx )
    ctx->NeedEyeNormals = GL_FALSE;
    ctx->vb_proj_matrix = &ctx->ModelProjectMatrix;
 
-   /* Display list */
-   ctx->CallDepth = 0;
-   ctx->ExecuteFlag = GL_TRUE;
-   ctx->CompileFlag = GL_FALSE;
-   ctx->CurrentListPtr = NULL;
-   ctx->CurrentBlock = NULL;
-   ctx->CurrentListNum = 0;
-   ctx->CurrentPos = 0;
-
    ctx->ErrorValue = (GLenum) GL_NO_ERROR;
 
    ctx->CatchSignals = GL_TRUE;
+   ctx->OcclusionResult = GL_FALSE;
+   ctx->OcclusionResultSaved = GL_FALSE;
 
    /* For debug/development only */
    ctx->NoRaster = getenv("MESA_NO_RASTER") ? GL_TRUE : GL_FALSE;
@@ -1210,7 +1283,8 @@ static void init_attrib_groups( GLcontext *ctx )
  * the allocations clean up and return GL_FALSE.
  * Return:  GL_TRUE=success, GL_FALSE=failure
  */
-static GLboolean alloc_proxy_textures( GLcontext *ctx )
+static GLboolean
+alloc_proxy_textures( GLcontext *ctx )
 {
    GLboolean out_of_memory;
    GLint i;
@@ -1235,9 +1309,9 @@ static GLboolean alloc_proxy_textures( GLcontext *ctx )
 
    out_of_memory = GL_FALSE;
    for (i=0;i<MAX_TEXTURE_LEVELS;i++) {
-      ctx->Texture.Proxy1D->Image[i] = gl_alloc_texture_image();
-      ctx->Texture.Proxy2D->Image[i] = gl_alloc_texture_image();
-      ctx->Texture.Proxy3D->Image[i] = gl_alloc_texture_image();
+      ctx->Texture.Proxy1D->Image[i] = _mesa_alloc_texture_image();
+      ctx->Texture.Proxy2D->Image[i] = _mesa_alloc_texture_image();
+      ctx->Texture.Proxy3D->Image[i] = _mesa_alloc_texture_image();
       if (!ctx->Texture.Proxy1D->Image[i]
           || !ctx->Texture.Proxy2D->Image[i]
           || !ctx->Texture.Proxy3D->Image[i]) {
@@ -1247,13 +1321,13 @@ static GLboolean alloc_proxy_textures( GLcontext *ctx )
    if (out_of_memory) {
       for (i=0;i<MAX_TEXTURE_LEVELS;i++) {
          if (ctx->Texture.Proxy1D->Image[i]) {
-            gl_free_texture_image(ctx->Texture.Proxy1D->Image[i]);
+            _mesa_free_texture_image(ctx->Texture.Proxy1D->Image[i]);
          }
          if (ctx->Texture.Proxy2D->Image[i]) {
-            gl_free_texture_image(ctx->Texture.Proxy2D->Image[i]);
+            _mesa_free_texture_image(ctx->Texture.Proxy2D->Image[i]);
          }
          if (ctx->Texture.Proxy3D->Image[i]) {
-            gl_free_texture_image(ctx->Texture.Proxy3D->Image[i]);
+            _mesa_free_texture_image(ctx->Texture.Proxy3D->Image[i]);
          }
       }
       gl_free_texture_object(NULL, ctx->Texture.Proxy1D);
@@ -1271,12 +1345,15 @@ static GLboolean alloc_proxy_textures( GLcontext *ctx )
 /*
  * Initialize a GLcontext struct.
  */
-GLboolean gl_initialize_context_data( GLcontext *ctx,
-                                      GLvisual *visual,
-                                      GLcontext *share_list,
-                                      void *driver_ctx,
-                                      GLboolean direct )
+GLboolean
+_mesa_initialize_context( GLcontext *ctx,
+                          GLvisual *visual,
+                          GLcontext *share_list,
+                          void *driver_ctx,
+                          GLboolean direct )
 {
+   GLuint dispatchSize;
+
    (void) direct;  /* not used */
 
    /* misc one-time initializations */
@@ -1315,7 +1392,9 @@ GLboolean gl_initialize_context_data( GLcontext *ctx,
          return GL_FALSE;
       }
    }
+   _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
    ctx->Shared->RefCount++;
+   _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
 
    init_attrib_groups( ctx );
 
@@ -1337,10 +1416,6 @@ GLboolean gl_initialize_context_data( GLcontext *ctx,
       ctx->Pixel.DriverReadBuffer = GL_FRONT_LEFT;
    }
 
-#ifdef PROFILE
-   init_timings( ctx );
-#endif
-
    if (!alloc_proxy_textures(ctx)) {
       free_shared_state(ctx, ctx->Shared);
       FREE(ctx->VB);
@@ -1349,10 +1424,38 @@ GLboolean gl_initialize_context_data( GLcontext *ctx,
       return GL_FALSE;
    }
 
+   /* register the most recent extension functions with libGL */
+   _glapi_add_entrypoint("glTbufferMask3DFX", 553);
+   _glapi_add_entrypoint("glCompressedTexImage3DARB", 554);
+   _glapi_add_entrypoint("glCompressedTexImage2DARB", 555);
+   _glapi_add_entrypoint("glCompressedTexImage1DARB", 556);
+   _glapi_add_entrypoint("glCompressedTexSubImage3DARB", 557);
+   _glapi_add_entrypoint("glCompressedTexSubImage2DARB", 558);
+   _glapi_add_entrypoint("glCompressedTexSubImage1DARB", 559);
+   _glapi_add_entrypoint("glGetCompressedTexImageARB", 560);
+
+   /* Find the larger of Mesa's dispatch table and libGL's dispatch table.
+    * In practice, this'll be the same for stand-alone Mesa.  But for DRI
+    * Mesa we do this to accomodate different versions of libGL and various
+    * DRI drivers.
+    */
+   dispatchSize = MAX2(_glapi_get_dispatch_table_size(),
+                       sizeof(struct _glapi_table) / sizeof(void *));
+
    /* setup API dispatch tables */
-   _mesa_init_exec_table( &ctx->Exec );
-   _mesa_init_dlist_table( &ctx->Save );
-   ctx->CurrentDispatch = &ctx->Exec;
+   ctx->Exec = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
+   ctx->Save = (struct _glapi_table *) CALLOC(dispatchSize * sizeof(void*));
+   if (!ctx->Exec || !ctx->Save) {
+      free_shared_state(ctx, ctx->Shared);
+      FREE(ctx->VB);
+      FREE(ctx->PB);
+      if (ctx->Exec)
+         FREE(ctx->Exec);
+      FREE(ctx);
+   }
+   _mesa_init_exec_table(ctx->Exec, dispatchSize);
+   _mesa_init_dlist_table(ctx->Save, dispatchSize);
+   ctx->CurrentDispatch = ctx->Exec;
 
    return GL_TRUE;
 }
@@ -1366,18 +1469,18 @@ GLboolean gl_initialize_context_data( GLcontext *ctx,
  *         driver_ctx - pointer to device driver's context state struct
  * Return:  pointer to a new gl_context struct or NULL if error.
  */
-GLcontext *gl_create_context( GLvisual *visual,
-                              GLcontext *share_list,
-                              void *driver_ctx,
-                              GLboolean direct )
+GLcontext *
+gl_create_context( GLvisual *visual,
+                   GLcontext *share_list,
+                   void *driver_ctx,
+                   GLboolean direct )
 {
    GLcontext *ctx = (GLcontext *) CALLOC( sizeof(GLcontext) );
    if (!ctx) {
       return NULL;
    }
 
-   if (gl_initialize_context_data(ctx, visual, share_list,
-                                  driver_ctx, direct)) {
+   if (_mesa_initialize_context(ctx, visual, share_list, driver_ctx, direct)) {
       return ctx;
    }
    else {
@@ -1392,41 +1495,44 @@ GLcontext *gl_create_context( GLvisual *visual,
  * Free the data associated with the given context.
  * But don't free() the GLcontext struct itself!
  */
-void gl_free_context_data( GLcontext *ctx )
+void
+gl_free_context_data( GLcontext *ctx )
 {
-   GLuint i;
    struct gl_shine_tab *s, *tmps;
+   GLuint i, j;
 
    /* if we're destroying the current context, unbind it first */
    if (ctx == gl_get_current_context()) {
       gl_make_current(NULL, NULL);
    }
 
-#ifdef PROFILE
-   if (getenv("MESA_PROFILE")) {
-      print_timings( ctx );
-   }
-#endif
-
    gl_matrix_dtr( &ctx->ModelView );
-   for (i = 0 ; i < MAX_MODELVIEW_STACK_DEPTH ; i++) {
+   for (i = 0; i < MAX_MODELVIEW_STACK_DEPTH - 1; i++) {
       gl_matrix_dtr( &ctx->ModelViewStack[i] );
    }
    gl_matrix_dtr( &ctx->ProjectionMatrix );
-   for (i = 0 ; i < MAX_PROJECTION_STACK_DEPTH ; i++) {
+   for (i = 0; i < MAX_PROJECTION_STACK_DEPTH - 1; i++) {
       gl_matrix_dtr( &ctx->ProjectionStack[i] );
    }
+   for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
+      gl_matrix_dtr( &ctx->TextureMatrix[i] );
+      for (j = 0; j < MAX_TEXTURE_STACK_DEPTH - 1; j++) {
+         gl_matrix_dtr( &ctx->TextureStack[i][j] );
+      }
+   }
 
    FREE( ctx->PB );
 
-   if(ctx->input != ctx->VB->IM)
+   if (ctx->input != ctx->VB->IM)
       gl_immediate_free( ctx->input );
 
    gl_vb_free( ctx->VB );
 
+   _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
    ctx->Shared->RefCount--;
-   assert(ctx->Shared->RefCount>=0);
-   if (ctx->Shared->RefCount==0) {
+   assert(ctx->Shared->RefCount >= 0);
+   _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
+   if (ctx->Shared->RefCount == 0) {
       /* free shared state */
       free_shared_state( ctx, ctx->Shared );
    }
@@ -1480,6 +1586,11 @@ void gl_free_context_data( GLcontext *ctx )
    if (ctx->EvalMap.Map2Texture4.Points)
       FREE( ctx->EvalMap.Map2Texture4.Points );
 
+   _mesa_free_colortable_data( &ctx->ColorTable );
+   _mesa_free_colortable_data( &ctx->PostConvolutionColorTable );
+   _mesa_free_colortable_data( &ctx->PostColorMatrixColorTable );
+   _mesa_free_colortable_data( &ctx->Texture.Palette );
+
    /* Free cache of immediate buffers. */
    while (ctx->nr_im_queued-- > 0) {
       struct immediate * next = ctx->freed_im_queue->next;
@@ -1487,6 +1598,9 @@ void gl_free_context_data( GLcontext *ctx )
       ctx->freed_im_queue = next;
    }
    gl_extensions_dtr(ctx);
+
+   FREE(ctx->Exec);
+   FREE(ctx->Save);
 }
 
 
@@ -1494,7 +1608,8 @@ void gl_free_context_data( GLcontext *ctx )
 /*
  * Destroy a GLcontext structure.
  */
-void gl_destroy_context( GLcontext *ctx )
+void
+gl_destroy_context( GLcontext *ctx )
 {
    if (ctx) {
       gl_free_context_data(ctx);
@@ -1508,7 +1623,8 @@ void gl_destroy_context( GLcontext *ctx )
  * Called by the driver after both the context and driver are fully
  * initialized.  Currently just reads the config file.
  */
-void gl_context_initialize( GLcontext *ctx )
+void
+gl_context_initialize( GLcontext *ctx )
 {
    gl_read_config_file( ctx );
 }
@@ -1521,7 +1637,8 @@ void gl_context_initialize( GLcontext *ctx )
  *         dst - destination context
  *         mask - bitwise OR of GL_*_BIT flags
  */
-void gl_copy_context( const GLcontext *src, GLcontext *dst, GLuint mask )
+void
+gl_copy_context( const GLcontext *src, GLcontext *dst, GLuint mask )
 {
    if (mask & GL_ACCUM_BUFFER_BIT) {
       MEMCPY( &dst->Accum, &src->Accum, sizeof(struct gl_accum_attrib) );
@@ -1610,7 +1727,7 @@ void gl_make_current2( GLcontext *newCtx, GLframebuffer *drawBuffer,
                        GLframebuffer *readBuffer )
 {
 #if 0
-   GLcontext *oldCtx = gl_get_current_context();
+   GLcontext *oldCtx = gl_get_context();
 
    /* Flush the old context
     */
@@ -1632,7 +1749,7 @@ void gl_make_current2( GLcontext *newCtx, GLframebuffer *drawBuffer,
     */
    _glapi_check_multithread();
 
-   _glapi_set_current_context((void *) newCtx);
+   _glapi_set_context((void *) newCtx);
    ASSERT(gl_get_current_context() == newCtx);
    if (newCtx) {
       SET_IMMEDIATE(newCtx, newCtx->input);
@@ -1687,7 +1804,7 @@ void gl_make_current2( GLcontext *newCtx, GLframebuffer *drawBuffer,
  */
 GLcontext *gl_get_current_context( void )
 {
-   return (GLcontext *) _glapi_get_current_context();
+   return (GLcontext *) _glapi_get_context();
 }
 
 
@@ -1717,47 +1834,6 @@ _mesa_get_dispatch(GLcontext *ctx)
 
 
 
-void
-_mesa_ResizeBuffersMESA( void )
-{
-   GLcontext *ctx = gl_get_current_context();
-
-   GLuint buf_width, buf_height;
-
-   if (MESA_VERBOSE & VERBOSE_API)
-      fprintf(stderr, "glResizeBuffersMESA\n");
-
-   /* ask device driver for size of output buffer */
-   (*ctx->Driver.GetBufferSize)( ctx, &buf_width, &buf_height );
-
-   /* see if size of device driver's color buffer (window) has changed */
-   if (ctx->DrawBuffer->Width == (GLint) buf_width &&
-       ctx->DrawBuffer->Height == (GLint) buf_height)
-      return;
-
-   ctx->NewState |= NEW_RASTER_OPS;  /* to update scissor / window bounds */
-
-   /* save buffer size */
-   ctx->DrawBuffer->Width = buf_width;
-   ctx->DrawBuffer->Height = buf_height;
-
-   /* Reallocate other buffers if needed. */
-   if (ctx->DrawBuffer->UseSoftwareDepthBuffer) {
-      gl_alloc_depth_buffer( ctx );
-   }
-   if (ctx->DrawBuffer->UseSoftwareStencilBuffer) {
-      gl_alloc_stencil_buffer( ctx );
-   }
-   if (ctx->DrawBuffer->UseSoftwareAccumBuffer) {
-      gl_alloc_accum_buffer( ctx );
-   }
-   if (ctx->Visual->SoftwareAlpha) {
-      gl_alloc_alpha_buffers( ctx );
-   }
-}
-
-
-
 /**********************************************************************/
 /*****                Miscellaneous functions                     *****/
 /**********************************************************************/
@@ -1770,7 +1846,7 @@ _mesa_ResizeBuffersMESA( void )
 void gl_problem( const GLcontext *ctx, const char *s )
 {
    fprintf( stderr, "Mesa implementation error: %s\n", s );
-   fprintf( stderr, "Report to mesa-bugs@mesa3d.org\n" );
+   fprintf( stderr, "Report to Mesa bug database at www.mesa3d.org\n" );
    (void) ctx;
 }
 
@@ -1802,6 +1878,9 @@ void gl_warning( const GLcontext *ctx, const char *s )
 
 
 
+/*
+ * Compile an error into current display list.
+ */
 void gl_compile_error( GLcontext *ctx, GLenum error, const char *s )
 {
    if (ctx->CompileFlag)
@@ -1812,6 +1891,7 @@ void gl_compile_error( GLcontext *ctx, GLenum error, const char *s )
 }
 
 
+
 /*
  * This is Mesa's error handler.  Normally, all that's done is the updating
  * of the current error value.  If Mesa is compiled with -DDEBUG or if the
@@ -1879,588 +1959,24 @@ void gl_error( GLcontext *ctx, GLenum error, const char *s )
 
 
 
-/**********************************************************************/
-/*****                   State update logic                       *****/
-/**********************************************************************/
-
-
-/*
- * Since the device driver may or may not support pixel logic ops we
- * have to make some extensive tests to determine whether or not
- * software-implemented logic operations have to be used.
- */
-static void update_pixel_logic( GLcontext *ctx )
-{
-   if (ctx->Visual->RGBAflag) {
-      /* RGBA mode blending w/ Logic Op */
-      if (ctx->Color.ColorLogicOpEnabled) {
-        if (ctx->Driver.LogicOp
-             && (*ctx->Driver.LogicOp)( ctx, ctx->Color.LogicOp )) {
-           /* Device driver can do logic, don't have to do it in software */
-           ctx->Color.SWLogicOpEnabled = GL_FALSE;
-        }
-        else {
-           /* Device driver can't do logic op so we do it in software */
-           ctx->Color.SWLogicOpEnabled = GL_TRUE;
-        }
-      }
-      else {
-        /* no logic op */
-        if (ctx->Driver.LogicOp) {
-            (void) (*ctx->Driver.LogicOp)( ctx, GL_COPY );
-         }
-        ctx->Color.SWLogicOpEnabled = GL_FALSE;
-      }
-   }
-   else {
-      /* CI mode Logic Op */
-      if (ctx->Color.IndexLogicOpEnabled) {
-        if (ctx->Driver.LogicOp
-             && (*ctx->Driver.LogicOp)( ctx, ctx->Color.LogicOp )) {
-           /* Device driver can do logic, don't have to do it in software */
-           ctx->Color.SWLogicOpEnabled = GL_FALSE;
-        }
-        else {
-           /* Device driver can't do logic op so we do it in software */
-           ctx->Color.SWLogicOpEnabled = GL_TRUE;
-        }
-      }
-      else {
-        /* no logic op */
-        if (ctx->Driver.LogicOp) {
-            (void) (*ctx->Driver.LogicOp)( ctx, GL_COPY );
-         }
-        ctx->Color.SWLogicOpEnabled = GL_FALSE;
-      }
-   }
-}
-
-
-
-/*
- * Check if software implemented RGBA or Color Index masking is needed.
- */
-static void update_pixel_masking( GLcontext *ctx )
-{
-   if (ctx->Visual->RGBAflag) {
-      GLuint *colorMask = (GLuint *) ctx->Color.ColorMask;
-      if (*colorMask == 0xffffffff) {
-         /* disable masking */
-         if (ctx->Driver.ColorMask) {
-            (void) (*ctx->Driver.ColorMask)( ctx, GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE );
-         }
-         ctx->Color.SWmasking = GL_FALSE;
-      }
-      else {
-         /* Ask driver to do color masking, if it can't then
-          * do it in software
-          */
-         GLboolean red   = ctx->Color.ColorMask[RCOMP] ? GL_TRUE : GL_FALSE;
-         GLboolean green = ctx->Color.ColorMask[GCOMP] ? GL_TRUE : GL_FALSE;
-         GLboolean blue  = ctx->Color.ColorMask[BCOMP] ? GL_TRUE : GL_FALSE;
-         GLboolean alpha = ctx->Color.ColorMask[ACOMP] ? GL_TRUE : GL_FALSE;
-         if (ctx->Driver.ColorMask
-             && (*ctx->Driver.ColorMask)( ctx, red, green, blue, alpha )) {
-            ctx->Color.SWmasking = GL_FALSE;
-         }
-         else {
-            ctx->Color.SWmasking = GL_TRUE;
-         }
-      }
-   }
-   else {
-      if (ctx->Color.IndexMask==0xffffffff) {
-         /* disable masking */
-         if (ctx->Driver.IndexMask) {
-            (void) (*ctx->Driver.IndexMask)( ctx, 0xffffffff );
-         }
-         ctx->Color.SWmasking = GL_FALSE;
-      }
-      else {
-         /* Ask driver to do index masking, if it can't then
-          * do it in software
-          */
-         if (ctx->Driver.IndexMask
-             && (*ctx->Driver.IndexMask)( ctx, ctx->Color.IndexMask )) {
-            ctx->Color.SWmasking = GL_FALSE;
-         }
-         else {
-            ctx->Color.SWmasking = GL_TRUE;
-         }
-      }
-   }
-}
-
-
-static void update_fog_mode( GLcontext *ctx )
-{
-   int old_mode = ctx->FogMode;
-
-   if (ctx->Fog.Enabled) {
-      if (ctx->Texture.Enabled)
-         ctx->FogMode = FOG_FRAGMENT;
-      else if (ctx->Hint.Fog == GL_NICEST)
-         ctx->FogMode = FOG_FRAGMENT;
-      else
-         ctx->FogMode = FOG_VERTEX;
-
-      if (ctx->Driver.GetParameteri)
-         if ((ctx->Driver.GetParameteri)( ctx, DD_HAVE_HARDWARE_FOG ))
-            ctx->FogMode = FOG_FRAGMENT;
-   }
-   else {
-      ctx->FogMode = FOG_NONE;
-   }
-   
-   if (old_mode != ctx->FogMode)
-      ctx->NewState |= NEW_FOG;
-}
-
-
-/*
- * Recompute the value of ctx->RasterMask, etc. according to
- * the current context.
- */
-static void update_rasterflags( GLcontext *ctx )
+void
+_mesa_Finish( void )
 {
-   ctx->RasterMask = 0;
-
-   if (ctx->Color.AlphaEnabled)                ctx->RasterMask |= ALPHATEST_BIT;
-   if (ctx->Color.BlendEnabled)                ctx->RasterMask |= BLEND_BIT;
-   if (ctx->Depth.Test)                        ctx->RasterMask |= DEPTH_BIT;
-   if (ctx->FogMode==FOG_FRAGMENT)     ctx->RasterMask |= FOG_BIT;
-   if (ctx->Color.SWLogicOpEnabled)    ctx->RasterMask |= LOGIC_OP_BIT;
-   if (ctx->Scissor.Enabled)           ctx->RasterMask |= SCISSOR_BIT;
-   if (ctx->Stencil.Enabled)           ctx->RasterMask |= STENCIL_BIT;
-   if (ctx->Color.SWmasking)           ctx->RasterMask |= MASKING_BIT;
-
-   if (ctx->Visual->SoftwareAlpha && ctx->Color.ColorMask[ACOMP]
-       && ctx->Color.DrawBuffer != GL_NONE)
-      ctx->RasterMask |= ALPHABUF_BIT;
-
-   if (   ctx->Viewport.X<0
-       || ctx->Viewport.X + ctx->Viewport.Width > ctx->DrawBuffer->Width
-       || ctx->Viewport.Y<0
-       || ctx->Viewport.Y + ctx->Viewport.Height > ctx->DrawBuffer->Height) {
-      ctx->RasterMask |= WINCLIP_BIT;
-   }
-
-   /* If we're not drawing to exactly one color buffer set the
-    * MULTI_DRAW_BIT flag.  Also set it if we're drawing to no
-    * buffers or the RGBA or CI mask disables all writes.
-    */
-
-   ctx->TriangleCaps &= ~DD_MULTIDRAW;
-
-   if (ctx->Color.MultiDrawBuffer) {
-      ctx->RasterMask |= MULTI_DRAW_BIT;
-      ctx->TriangleCaps |= DD_MULTIDRAW;
+   GET_CURRENT_CONTEXT(ctx);
+   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glFinish");
+   if (ctx->Driver.Finish) {
+      (*ctx->Driver.Finish)( ctx );
    }
-   else if (ctx->Color.DrawBuffer==GL_NONE) {
-      ctx->RasterMask |= MULTI_DRAW_BIT;
-      ctx->TriangleCaps |= DD_MULTIDRAW;
-   }
-   else if (ctx->Visual->RGBAflag && ctx->Color.ColorMask==0) {
-      /* all RGBA channels disabled */
-      ctx->RasterMask |= MULTI_DRAW_BIT;
-      ctx->TriangleCaps |= DD_MULTIDRAW;
-      ctx->Color.DrawDestMask = 0;
-   }
-   else if (!ctx->Visual->RGBAflag && ctx->Color.IndexMask==0) {
-      /* all color index bits disabled */
-      ctx->RasterMask |= MULTI_DRAW_BIT;
-      ctx->TriangleCaps |= DD_MULTIDRAW;
-      ctx->Color.DrawDestMask = 0;
-   }
-}
-
-
-void gl_print_state( const char *msg, GLuint state )
-{
-   fprintf(stderr,
-          "%s: (0x%x) %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
-          msg,
-          state,
-          (state & NEW_LIGHTING)         ? "lighting, " : "",
-          (state & NEW_RASTER_OPS)       ? "raster-ops, " : "",
-          (state & NEW_TEXTURING)        ? "texturing, " : "",
-          (state & NEW_POLYGON)          ? "polygon, " : "",
-          (state & NEW_DRVSTATE0)        ? "driver-0, " : "",
-          (state & NEW_DRVSTATE1)        ? "driver-1, " : "",
-          (state & NEW_DRVSTATE2)        ? "driver-2, " : "",
-          (state & NEW_DRVSTATE3)        ? "driver-3, " : "",
-          (state & NEW_MODELVIEW)        ? "modelview, " : "",
-          (state & NEW_PROJECTION)       ? "projection, " : "",
-          (state & NEW_TEXTURE_MATRIX)   ? "texture-matrix, " : "",
-          (state & NEW_USER_CLIP)        ? "user-clip, " : "",
-          (state & NEW_TEXTURE_ENV)      ? "texture-env, " : "",
-          (state & NEW_CLIENT_STATE)     ? "client-state, " : "",
-          (state & NEW_FOG)              ? "fog, " : "",
-          (state & NEW_NORMAL_TRANSFORM) ? "normal-transform, " : "",
-          (state & NEW_VIEWPORT)         ? "viewport, " : "",
-          (state & NEW_TEXTURE_ENABLE)   ? "texture-enable, " : "");
 }
 
-void gl_print_enable_flags( const char *msg, GLuint flags )
-{
-   fprintf(stderr,
-          "%s: (0x%x) %s%s%s%s%s%s%s%s%s%s%s\n",
-          msg,
-          flags,
-          (flags & ENABLE_TEX0)       ? "tex-0, " : "",
-          (flags & ENABLE_TEX1)       ? "tex-1, " : "",
-          (flags & ENABLE_LIGHT)      ? "light, " : "",
-          (flags & ENABLE_FOG)        ? "fog, " : "",
-          (flags & ENABLE_USERCLIP)   ? "userclip, " : "",
-          (flags & ENABLE_TEXGEN0)    ? "tex-gen-0, " : "",
-          (flags & ENABLE_TEXGEN1)    ? "tex-gen-1, " : "",
-          (flags & ENABLE_TEXMAT0)    ? "tex-mat-0, " : "",
-          (flags & ENABLE_TEXMAT1)    ? "tex-mat-1, " : "",
-          (flags & ENABLE_NORMALIZE)  ? "normalize, " : "",
-          (flags & ENABLE_RESCALE)    ? "rescale, " : "");
-}
 
 
-/*
- * If ctx->NewState is non-zero then this function MUST be called before
- * rendering any primitive.  Basically, function pointers and miscellaneous
- * flags are updated to reflect the current state of the state machine.
- */
-void gl_update_state( GLcontext *ctx )
+void
+_mesa_Flush( void )
 {
-   GLuint i;
-
-   if (MESA_VERBOSE & VERBOSE_STATE)
-      gl_print_state("", ctx->NewState);
-
-   if (ctx->NewState & NEW_CLIENT_STATE)
-      gl_update_client_state( ctx );
-
-   if ((ctx->NewState & NEW_TEXTURE_ENABLE) &&
-       (ctx->Enabled & ENABLE_TEX_ANY) != ctx->Texture.Enabled)
-      ctx->NewState |= NEW_TEXTURING | NEW_RASTER_OPS;
-
-   if (ctx->NewState & NEW_TEXTURE_ENV) {
-      if (ctx->Texture.Unit[0].EnvMode == ctx->Texture.Unit[0].LastEnvMode &&
-         ctx->Texture.Unit[1].EnvMode == ctx->Texture.Unit[1].LastEnvMode)
-        ctx->NewState &= ~NEW_TEXTURE_ENV;
-      ctx->Texture.Unit[0].LastEnvMode = ctx->Texture.Unit[0].EnvMode;
-      ctx->Texture.Unit[1].LastEnvMode = ctx->Texture.Unit[1].EnvMode;
-   }
-
-   if (ctx->NewState & NEW_TEXTURE_MATRIX) {
-      ctx->Enabled &= ~(ENABLE_TEXMAT0|ENABLE_TEXMAT1);
-
-      for (i=0; i < MAX_TEXTURE_UNITS; i++) {
-        if (ctx->TextureMatrix[i].flags & MAT_DIRTY_ALL_OVER)
-        {
-           gl_matrix_analyze( &ctx->TextureMatrix[i] );
-           ctx->TextureMatrix[i].flags &= ~MAT_DIRTY_DEPENDENTS;
-
-           if (ctx->Texture.Unit[i].Enabled &&
-               ctx->TextureMatrix[i].type != MATRIX_IDENTITY)
-              ctx->Enabled |= ENABLE_TEXMAT0 << i;
-        }
-      }
-   }
-
-   if (ctx->NewState & (NEW_TEXTURING | NEW_TEXTURE_ENABLE)) {
-      ctx->Texture.NeedNormals = GL_FALSE;
-      gl_update_dirty_texobjs(ctx);
-      ctx->Enabled &= ~(ENABLE_TEXGEN0|ENABLE_TEXGEN1);
-      ctx->Texture.ReallyEnabled = 0;
-
-      for (i=0; i < MAX_TEXTURE_UNITS; i++) {
-        if (ctx->Texture.Unit[i].Enabled) {
-           gl_update_texture_unit( ctx, &ctx->Texture.Unit[i] );
-
-           ctx->Texture.ReallyEnabled |=
-              ctx->Texture.Unit[i].ReallyEnabled<<(i*4);
-
-           if (ctx->Texture.Unit[i].GenFlags != 0) {
-              ctx->Enabled |= ENABLE_TEXGEN0 << i;
-
-              if (ctx->Texture.Unit[i].GenFlags & TEXGEN_NEED_NORMALS)
-              {
-                 ctx->Texture.NeedNormals = GL_TRUE;
-                 ctx->Texture.NeedEyeCoords = GL_TRUE;
-              }
-
-              if (ctx->Texture.Unit[i].GenFlags & TEXGEN_NEED_EYE_COORD)
-              {
-                 ctx->Texture.NeedEyeCoords = GL_TRUE;
-              }
-           }
-        }
-      }
-
-      ctx->Texture.Enabled = ctx->Enabled & ENABLE_TEX_ANY;
-      ctx->NeedNormals = (ctx->Light.Enabled || ctx->Texture.NeedNormals);
-   }
-
-   if (ctx->NewState & (NEW_RASTER_OPS | NEW_LIGHTING | NEW_FOG)) {
-
-
-      if (ctx->NewState & NEW_RASTER_OPS) {
-        update_pixel_logic(ctx);
-        update_pixel_masking(ctx);
-        update_fog_mode(ctx);
-        update_rasterflags(ctx);
-        if (ctx->Driver.Dither) {
-           (*ctx->Driver.Dither)( ctx, ctx->Color.DitherFlag );
-        }
-
-        /* Check if incoming colors can be modified during rasterization */
-        if (ctx->Fog.Enabled ||
-            ctx->Texture.Enabled ||
-            ctx->Color.BlendEnabled ||
-            ctx->Color.SWmasking ||
-            ctx->Color.SWLogicOpEnabled) {
-           ctx->MutablePixels = GL_TRUE;
-        }
-        else {
-           ctx->MutablePixels = GL_FALSE;
-        }
-
-        /* update scissor region */
-
-        ctx->DrawBuffer->Xmin = 0;
-        ctx->DrawBuffer->Ymin = 0;
-        ctx->DrawBuffer->Xmax = ctx->DrawBuffer->Width-1;
-        ctx->DrawBuffer->Ymax = ctx->DrawBuffer->Height-1;
-        if (ctx->Scissor.Enabled) {
-           if (ctx->Scissor.X > ctx->DrawBuffer->Xmin) {
-              ctx->DrawBuffer->Xmin = ctx->Scissor.X;
-           }
-           if (ctx->Scissor.Y > ctx->DrawBuffer->Ymin) {
-              ctx->DrawBuffer->Ymin = ctx->Scissor.Y;
-           }
-           if (ctx->Scissor.X + ctx->Scissor.Width - 1 < ctx->DrawBuffer->Xmax) {
-              ctx->DrawBuffer->Xmax = ctx->Scissor.X + ctx->Scissor.Width - 1;
-           }
-           if (ctx->Scissor.Y + ctx->Scissor.Height - 1 < ctx->DrawBuffer->Ymax) {
-              ctx->DrawBuffer->Ymax = ctx->Scissor.Y + ctx->Scissor.Height - 1;
-           }
-        }
-      }
-
-      if (ctx->NewState & NEW_LIGHTING) {
-        ctx->TriangleCaps &= ~(DD_TRI_LIGHT_TWOSIDE|DD_LIGHTING_CULL);
-        if (ctx->Light.Enabled) {
-           if (ctx->Light.Model.TwoSide)
-              ctx->TriangleCaps |= (DD_TRI_LIGHT_TWOSIDE|DD_LIGHTING_CULL);
-           gl_update_lighting(ctx);
-        }
-      }
+   GET_CURRENT_CONTEXT(ctx);
+   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glFlush");
+   if (ctx->Driver.Flush) {
+      (*ctx->Driver.Flush)( ctx );
    }
-
-   if (ctx->NewState & (NEW_POLYGON | NEW_LIGHTING)) {
-
-      ctx->TriangleCaps &= ~DD_TRI_CULL_FRONT_BACK;
-
-      if (ctx->NewState & NEW_POLYGON) {
-        /* Setup CullBits bitmask */
-        if (ctx->Polygon.CullFlag) {
-           ctx->backface_sign = 1;
-           switch(ctx->Polygon.CullFaceMode) {
-           case GL_BACK:
-              if(ctx->Polygon.FrontFace==GL_CCW)
-                 ctx->backface_sign = -1;
-              ctx->Polygon.CullBits = 1;
-              break;
-           case GL_FRONT:
-              if(ctx->Polygon.FrontFace!=GL_CCW)
-                 ctx->backface_sign = -1;
-              ctx->Polygon.CullBits = 2;
-              break;
-           default:
-           case GL_FRONT_AND_BACK:
-              ctx->backface_sign = 0;
-              ctx->Polygon.CullBits = 0;
-              ctx->TriangleCaps |= DD_TRI_CULL_FRONT_BACK;
-              break;
-           }
-        }
-        else {
-           ctx->Polygon.CullBits = 3;
-           ctx->backface_sign = 0;
-        }
-
-        /* Any Polygon offsets enabled? */
-        ctx->TriangleCaps &= ~DD_TRI_OFFSET;
-
-        if (ctx->Polygon.OffsetPoint ||
-            ctx->Polygon.OffsetLine ||
-            ctx->Polygon.OffsetFill)
-           ctx->TriangleCaps |= DD_TRI_OFFSET;
-
-        /* reset Z offsets now */
-        ctx->PointZoffset   = 0.0;
-        ctx->LineZoffset    = 0.0;
-        ctx->PolygonZoffset = 0.0;
-      }
-   }
-
-   if (ctx->NewState & ~(NEW_CLIENT_STATE|
-                        NEW_DRIVER_STATE|NEW_USER_CLIP|
-                        NEW_POLYGON))
-      gl_update_clipmask(ctx);
-
-   if (ctx->NewState & (NEW_LIGHTING|
-                       NEW_RASTER_OPS|
-                       NEW_TEXTURING|
-                       NEW_TEXTURE_ENABLE|
-                       NEW_TEXTURE_ENV|
-                       NEW_POLYGON|
-                       NEW_DRVSTATE0|
-                       NEW_DRVSTATE1|
-                       NEW_DRVSTATE2|
-                       NEW_DRVSTATE3|
-                       NEW_USER_CLIP))
-   {
-      ctx->IndirectTriangles = ctx->TriangleCaps & ~ctx->Driver.TriangleCaps;
-      ctx->IndirectTriangles |= DD_SW_RASTERIZE;
-
-      if (MESA_VERBOSE&VERBOSE_CULL)
-        gl_print_tri_caps("initial indirect tris", ctx->IndirectTriangles);
-
-      ctx->Driver.PointsFunc = NULL;
-      ctx->Driver.LineFunc = NULL;
-      ctx->Driver.TriangleFunc = NULL;
-      ctx->Driver.QuadFunc = NULL;
-      ctx->Driver.RectFunc = NULL;
-      ctx->Driver.RenderVBClippedTab = NULL;
-      ctx->Driver.RenderVBCulledTab = NULL;
-      ctx->Driver.RenderVBRawTab = NULL;
-
-      /*
-       * Here the driver sets up all the ctx->Driver function pointers to
-       * it's specific, private functions.
-       */
-      ctx->Driver.UpdateState(ctx);
-
-      if (MESA_VERBOSE&VERBOSE_CULL)
-        gl_print_tri_caps("indirect tris", ctx->IndirectTriangles);
-
-      /*
-       * In case the driver didn't hook in an optimized point, line or
-       * triangle function we'll now select "core/fallback" point, line
-       * and triangle functions.
-       */
-      if (ctx->IndirectTriangles & DD_SW_RASTERIZE) {
-        gl_set_point_function(ctx);
-        gl_set_line_function(ctx);
-        gl_set_triangle_function(ctx);
-        gl_set_quad_function(ctx);
-
-        if ((ctx->IndirectTriangles & 
-             (DD_TRI_SW_RASTERIZE|DD_QUAD_SW_RASTERIZE|DD_TRI_CULL)) ==
-            (DD_TRI_SW_RASTERIZE|DD_QUAD_SW_RASTERIZE|DD_TRI_CULL)) 
-           ctx->IndirectTriangles &= ~DD_TRI_CULL;
-      }
-
-      if (MESA_VERBOSE&VERBOSE_CULL)
-        gl_print_tri_caps("indirect tris 2", ctx->IndirectTriangles);
-
-      gl_set_render_vb_function(ctx);
-   }
-
-   /* Should only be calc'd when !need_eye_coords and not culling.
-    */
-   if (ctx->NewState & (NEW_MODELVIEW|NEW_PROJECTION)) {
-      if (ctx->NewState & NEW_MODELVIEW) {
-        gl_matrix_analyze( &ctx->ModelView );
-        ctx->ProjectionMatrix.flags &= ~MAT_DIRTY_DEPENDENTS;
-      }
-
-      if (ctx->NewState & NEW_PROJECTION) {
-        gl_matrix_analyze( &ctx->ProjectionMatrix );
-        ctx->ProjectionMatrix.flags &= ~MAT_DIRTY_DEPENDENTS;
-
-        if (ctx->Transform.AnyClip) {
-           gl_update_userclip( ctx );
-        }
-      }
-
-      gl_calculate_model_project_matrix( ctx );
-      ctx->ModelProjectWinMatrixUptodate = 0;
-   }
-
-   /* Figure out whether we can light in object space or not.  If we
-    * can, find the current positions of the lights in object space
-    */
-   if ((ctx->Enabled & (ENABLE_POINT_ATTEN | ENABLE_LIGHT | ENABLE_FOG |
-                       ENABLE_TEXGEN0 | ENABLE_TEXGEN1)) &&
-       (ctx->NewState & (NEW_LIGHTING | 
-                         NEW_FOG |
-                        NEW_MODELVIEW | 
-                        NEW_PROJECTION |
-                        NEW_TEXTURING |
-                        NEW_RASTER_OPS |
-                        NEW_USER_CLIP)))
-   {
-      GLboolean oldcoord, oldnorm;
-
-      oldcoord = ctx->NeedEyeCoords;
-      oldnorm = ctx->NeedEyeNormals;
-
-      ctx->NeedNormals = (ctx->Light.Enabled || ctx->Texture.NeedNormals);
-      ctx->NeedEyeCoords = ((ctx->Fog.Enabled && ctx->Hint.Fog != GL_NICEST) ||
-                           ctx->Point.Attenuated);
-      ctx->NeedEyeNormals = GL_FALSE;
-
-      if (ctx->Light.Enabled) {
-        if (ctx->Light.Flags & LIGHT_POSITIONAL) {
-           /* Need length for attenuation */
-           if (!TEST_MAT_FLAGS( &ctx->ModelView, MAT_FLAGS_LENGTH_PRESERVING))
-              ctx->NeedEyeCoords = GL_TRUE;
-        } else if (ctx->Light.NeedVertices) {
-           /* Need angle for spot calculations */
-           if (!TEST_MAT_FLAGS( &ctx->ModelView, MAT_FLAGS_ANGLE_PRESERVING))
-              ctx->NeedEyeCoords = GL_TRUE;
-        }
-        ctx->NeedEyeNormals = ctx->NeedEyeCoords;
-      }
-      if (ctx->Texture.Enabled || ctx->RenderMode==GL_FEEDBACK) {
-        if (ctx->Texture.NeedEyeCoords) ctx->NeedEyeCoords = GL_TRUE;
-        if (ctx->Texture.NeedNormals)
-           ctx->NeedNormals = ctx->NeedEyeNormals = GL_TRUE;
-      }
-
-      ctx->vb_proj_matrix = &ctx->ModelProjectMatrix;
-
-      if (ctx->NeedEyeCoords)
-        ctx->vb_proj_matrix = &ctx->ProjectionMatrix;
-
-      if (ctx->Light.Enabled) {
-        gl_update_lighting_function(ctx);
-
-        if ( (ctx->NewState & NEW_LIGHTING) ||
-             ((ctx->NewState & (NEW_MODELVIEW| NEW_PROJECTION)) &&
-              !ctx->NeedEyeCoords) ||
-             oldcoord != ctx->NeedEyeCoords ||
-             oldnorm != ctx->NeedEyeNormals) {
-           gl_compute_light_positions(ctx);
-        }
-
-        ctx->rescale_factor = 1.0F;
-
-        if (ctx->ModelView.flags & (MAT_FLAG_UNIFORM_SCALE |
-                                    MAT_FLAG_GENERAL_SCALE |
-                                    MAT_FLAG_GENERAL_3D |
-                                    MAT_FLAG_GENERAL) )
-
-        {
-           GLfloat *m = ctx->ModelView.inv;
-           GLfloat f = m[2]*m[2] + m[6]*m[6] + m[10]*m[10];
-           if (f > 1e-12 && (f-1)*(f-1) > 1e-12)
-              ctx->rescale_factor = 1.0/GL_SQRT(f);
-        }
-      }
-
-      gl_update_normal_transform( ctx );
-   }
-
-   gl_update_pipelines(ctx);
-   ctx->NewState = 0;
 }