work on GL_SGI_color_table
[mesa.git] / src / mesa / main / context.c
index 881dc0f09354863281d02ad34872d39b98adeb4b..9ff18aca609b5ae3ec156d15521d6152c732d94a 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: context.c,v 1.37 2000/01/31 23:11:39 brianp Exp $ */
+/* $Id: context.c,v 1.59 2000/04/12 00:27:37 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -35,7 +35,6 @@
 #include "context.h"
 #include "cva.h"
 #include "depth.h"
-#include "dispatch.h"
 #include "dlist.h"
 #include "eval.h"
 #include "enums.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"
@@ -71,7 +66,6 @@
 #include "varray.h"
 #include "vb.h"
 #include "vbcull.h"
-#include "vbfill.h"
 #include "vbrender.h"
 #include "vbxform.h"
 #include "vertices.h"
@@ -261,40 +255,60 @@ static void print_timings( GLcontext *ctx )
  *         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.
+ *         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.
  */
-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 *
+_mesa_create_visual( GLboolean rgbFlag,
+                     GLboolean alphaFlag,
+                     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 )
 {
    GLvisual *vis;
 
-   if (depthBits > (GLint) (8*sizeof(GLdepth))) {
-      /* can't meet depth buffer requirements */
+   /* 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);
+
+   if (depthBits < 0 || depthBits > 32) {
       return NULL;
    }
-   if (stencilBits > (GLint) (8*sizeof(GLstencil))) {
-      /* can't meet stencil buffer requirements */
+   if (stencilBits < 0 || stencilBits > (GLint) (8 * sizeof(GLstencil))) {
       return NULL;
    }
-   if (accumBits > (GLint) (8*sizeof(GLaccum))) {
-      /* can't meet accum buffer requirements */
+   if (accumRedBits < 0 || accumRedBits > (GLint) (8 * sizeof(GLaccum))) {
+      return NULL;
+   }
+   if (accumGreenBits < 0 || accumGreenBits > (GLint) (8 * sizeof(GLaccum))) {
+      return NULL;
+   }
+   if (accumBlueBits < 0 || accumBlueBits > (GLint) (8 * sizeof(GLaccum))) {
+      return NULL;
+   }
+   if (accumAlphaBits < 0 || accumAlphaBits > (GLint) (8 * sizeof(GLaccum))) {
       return NULL;
    }
 
@@ -309,23 +323,66 @@ GLvisual *gl_create_visual( GLboolean rgbFlag,
    vis->RedBits    = redBits;
    vis->GreenBits  = greenBits;
    vis->BlueBits   = blueBits;
-   vis->AlphaBits  = alphaFlag ? 8*sizeof(GLubyte) : alphaBits;
+   vis->AlphaBits  = alphaFlag ? (8 * sizeof(GLubyte)) : alphaBits;
 
-   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;
+   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;
 
    vis->SoftwareAlpha = alphaFlag;
 
+   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 {
+      vis->DepthMax = (1 << depthBits) - 1;
+      vis->DepthMaxF = (GLfloat) vis->DepthMax;
+   }
+
    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 )
+{
+   return _mesa_create_visual(rgbFlag, alphaFlag, dbFlag, stereoFlag,
+                              redBits, greenBits, blueBits, alphaBits,
+                              indexBits, depthBits, stencilBits,
+                              accumBits, accumBits, accumBits, accumBits, 0);
+}
+
+
+void
+_mesa_destroy_visual( GLvisual *vis )
+{
+   FREE(vis);
+}
+
 
+/* obsolete */
 void gl_destroy_visual( GLvisual *vis )
 {
-   FREE( vis );
+   _mesa_destroy_visual(vis);
 }
 
 
@@ -369,7 +426,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);
@@ -393,8 +452,8 @@ GLframebuffer *gl_create_framebuffer( GLvisual *visual,
 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 );
@@ -446,8 +505,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();
@@ -728,6 +787,12 @@ static void init_color_table( struct gl_color_table *p )
    p->Size = 1;
    p->IntFormat = GL_RGBA;
    p->Format = GL_RGBA;
+   p->RedSize = 8;
+   p->GreenSize = 8;
+   p->BlueSize = 8;
+   p->AlphaSize = 8;
+   p->IntensitySize = 0;
+   p->LuminanceSize = 0;
 }
 
 
@@ -740,18 +805,30 @@ static void init_attrib_groups( GLcontext *ctx )
 
    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.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;
 
    /* 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] );
    }
@@ -768,7 +845,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] );
    }
@@ -777,11 +854,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 );
 
@@ -840,6 +924,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;
@@ -917,10 +1002,36 @@ static void init_attrib_groups( GLcontext *ctx )
    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;
 
+   /* 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 );
    gl_cva_init( ctx );
@@ -1017,6 +1128,30 @@ 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;
+   ctx->Pixel.PostColorMatrixRedBias = 0.0;
+   ctx->Pixel.PostColorMatrixRedScale = 1.0;
+   ctx->Pixel.PostColorMatrixGreenBias = 0.0;
+   ctx->Pixel.PostColorMatrixGreenScale = 1.0;
+   ctx->Pixel.PostColorMatrixBlueBias = 0.0;
+   ctx->Pixel.PostColorMatrixBlueScale = 1.0;
+   ctx->Pixel.PostColorMatrixAlphaBias = 0.0;
+   ctx->Pixel.PostColorMatrixAlphaScale = 1.0;
+   ctx->Pixel.ColorTableScale[0] = 1.0F;
+   ctx->Pixel.ColorTableScale[1] = 1.0F;
+   ctx->Pixel.ColorTableScale[2] = 1.0F;
+   ctx->Pixel.ColorTableScale[3] = 1.0F;
+   ctx->Pixel.ColorTableBias[0] = 0.0F;
+   ctx->Pixel.ColorTableBias[1] = 0.0F;
+   ctx->Pixel.ColorTableBias[2] = 0.0F;
+   ctx->Pixel.ColorTableBias[3] = 0.0F;
+   ctx->Pixel.ColorTableEnabled = GL_FALSE;
+   ctx->Pixel.PostConvolutionColorTableEnabled = GL_FALSE;
+   ctx->Pixel.PostColorMatrixColorTableEnabled = GL_FALSE;
 
    /* Point group */
    ctx->Point.SmoothFlag = GL_FALSE;
@@ -1095,8 +1230,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
 
@@ -1180,6 +1315,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 */
+   init_color_table(&ctx->ColorTable);
+   init_color_table(&ctx->ProxyColorTable);
+   init_color_table(&ctx->PostConvolutionColorTable);
+   init_color_table(&ctx->ProxyPostConvolutionColorTable);
+   init_color_table(&ctx->PostColorMatrixColorTable);
+   init_color_table(&ctx->ProxyPostColorMatrixColorTable);
+
    /* Miscellaneous */
    ctx->NewState = NEW_ALL;
    ctx->RenderMode = GL_RENDER;
@@ -1191,18 +1343,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;
@@ -1251,9 +1396,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]) {
@@ -1263,13 +1408,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);
@@ -1368,9 +1513,19 @@ GLboolean gl_initialize_context_data( GLcontext *ctx,
    }
 
    /* 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(_glapi_get_dispatch_table_size() * sizeof(void *));
+   ctx->Save = (struct _glapi_table *) CALLOC(_glapi_get_dispatch_table_size() * 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 );
+   _mesa_init_dlist_table( ctx->Save );
+   ctx->CurrentDispatch = ctx->Exec;
 
    return GL_TRUE;
 }
@@ -1412,8 +1567,8 @@ GLcontext *gl_create_context( GLvisual *visual,
  */
 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()) {
@@ -1427,13 +1582,19 @@ void gl_free_context_data( GLcontext *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 );
 
@@ -1507,6 +1668,9 @@ void gl_free_context_data( GLcontext *ctx )
       ctx->freed_im_queue = next;
    }
    gl_extensions_dtr(ctx);
+
+   FREE(ctx->Exec);
+   FREE(ctx->Save);
 }
 
 
@@ -1737,47 +1901,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                     *****/
 /**********************************************************************/
@@ -1822,6 +1945,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)
@@ -1832,6 +1958,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
@@ -1899,588 +2026,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;
-   }
-   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;
+   GET_CURRENT_CONTEXT(ctx);
+   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glFinish");
+   if (ctx->Driver.Finish) {
+      (*ctx->Driver.Finish)( ctx );
    }
 }
 
 
-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);
-        }
-      }
-   }
-
-   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);
+   GET_CURRENT_CONTEXT(ctx);
+   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glFlush");
+   if (ctx->Driver.Flush) {
+      (*ctx->Driver.Flush)( 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;
 }