added gl_initialize_context_data(), gl_free_context_data(). code clean-up
authorBrian Paul <brian.paul@tungstengraphics.com>
Fri, 14 Jan 2000 04:45:47 +0000 (04:45 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Fri, 14 Jan 2000 04:45:47 +0000 (04:45 +0000)
src/mesa/main/context.c
src/mesa/main/context.h

index 2858f203ad350bacda519d281a7bee3a756f731b..2b2e8871e083e4d7b769f8da2a46b0545fb9875a 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: context.c,v 1.30 1999/12/17 17:00:32 brianp Exp $ */
+/* $Id: context.c,v 1.31 2000/01/14 04:45:47 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -248,6 +248,176 @@ static void print_timings( GLcontext *ctx )
 
 
 
+/**********************************************************************/
+/***** 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 (stencilBits > (GLint) (8*sizeof(GLstencil))) {
+      /* can't meet stencil buffer requirements */
+      return NULL;
+   }
+   if (accumBits > (GLint) (8*sizeof(GLaccum))) {
+      /* can't meet accum buffer requirements */
+      return NULL;
+   }
+
+   vis = (GLvisual *) CALLOC( sizeof(GLvisual) );
+   if (!vis) {
+      return NULL;
+   }
+
+   vis->RGBAflag   = rgbFlag;
+   vis->DBflag     = dbFlag;
+   vis->StereoFlag = stereoFlag;
+   vis->RedBits    = redBits;
+   vis->GreenBits  = greenBits;
+   vis->BlueBits   = blueBits;
+   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->SoftwareAlpha = alphaFlag;
+
+   return vis;
+}
+
+
+
+void gl_destroy_visual( GLvisual *vis )
+{
+   FREE( vis );
+}
+
+
+
+/**********************************************************************/
+/***** GL Framebuffer allocation/destruction                      *****/
+/**********************************************************************/
+
+
+/*
+ * Create a new framebuffer.  A GLframebuffer is a struct which
+ * encapsulates the depth, stencil and accum buffers and related
+ * parameters.
+ * Input:  visual - a GLvisual pointer
+ *         softwareDepth - create/use a software depth buffer?
+ *         softwareStencil - create/use a software stencil buffer?
+ *         softwareAccum - create/use a software accum buffer?
+ *         softwareAlpha - create/use a software alpha buffer?
+
+ * 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 *buffer;
+
+   buffer = CALLOC_STRUCT(gl_frame_buffer);
+   if (!buffer) {
+      return NULL;
+   }
+
+   /* sanity checks */
+   if (softwareDepth ) {
+      assert(visual->DepthBits > 0);
+   }
+   if (softwareStencil) {
+      assert(visual->StencilBits > 0);
+   }
+   if (softwareAccum) {
+      assert(visual->RGBAflag);
+      assert(visual->AccumBits > 0);
+   }
+   if (softwareAlpha) {
+      assert(visual->RGBAflag);
+      assert(visual->AlphaBits > 0);
+   }
+
+   buffer->Visual = visual;
+   buffer->UseSoftwareDepthBuffer = softwareDepth;
+   buffer->UseSoftwareStencilBuffer = softwareStencil;
+   buffer->UseSoftwareAccumBuffer = softwareAccum;
+   buffer->UseSoftwareAlphaBuffers = softwareAlpha;
+
+   return buffer;
+}
+
+
+
+/*
+ * Free a framebuffer struct and its buffers.
+ */
+void gl_destroy_framebuffer( GLframebuffer *buffer )
+{
+   if (buffer) {
+      if (buffer->Depth) {
+         FREE( buffer->Depth );
+      }
+      if (buffer->Accum) {
+         FREE( buffer->Accum );
+      }
+      if (buffer->Stencil) {
+         FREE( buffer->Stencil );
+      }
+      if (buffer->FrontLeftAlpha) {
+         FREE( buffer->FrontLeftAlpha );
+      }
+      if (buffer->BackLeftAlpha) {
+         FREE( buffer->BackLeftAlpha );
+      }
+      if (buffer->FrontRightAlpha) {
+         FREE( buffer->FrontRightAlpha );
+      }
+      if (buffer->BackRightAlpha) {
+         FREE( buffer->BackRightAlpha );
+      }
+      FREE(buffer);
+   }
+}
+
+
+
 /**********************************************************************/
 /*****       Context allocation, initialization, destroying       *****/
 /**********************************************************************/
@@ -260,6 +430,14 @@ static void one_time_init( void )
 {
    static GLboolean alreadyCalled = GL_FALSE;
    if (!alreadyCalled) {
+      /* do some implementation tests */
+      assert( sizeof(GLbyte) == 1 );
+      assert( sizeof(GLshort) >= 2 );
+      assert( sizeof(GLint) >= 4 );
+      assert( sizeof(GLubyte) == 1 );
+      assert( sizeof(GLushort) >= 2 );
+      assert( sizeof(GLuint) >= 4 );
+
       gl_init_clip();
       gl_init_eval();
       gl_init_fog();
@@ -280,6 +458,7 @@ static void one_time_init( void )
 }
 
 
+
 /*
  * Allocate and initialize a shared context state structure.
  */
@@ -361,9 +540,6 @@ 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.
@@ -493,6 +669,7 @@ static void init_fallback_arrays( GLcontext *ctx )
    cl->Enabled = 1;
 }
 
+
 /* Initialize a 1-D evaluator map */
 static void init_1d_map( struct gl_1d_map *map, int n, const float *initial )
 {
@@ -539,637 +716,489 @@ static void init_color_table( struct gl_color_table *p )
 
 
 /*
- * Initialize a gl_context structure to default values.
+ * Initialize the attribute groups in a GLcontext.
  */
-static void initialize_context( GLcontext *ctx )
+static void init_attrib_groups( GLcontext *ctx )
 {
    GLuint i, j;
 
-   if (ctx) {
-      /* Constants, may be overriden by device driver */
-      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;
-
-      /* 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++) {
-        gl_matrix_ctr( &ctx->ModelViewStack[i] );
-        gl_matrix_alloc_inv( &ctx->ModelViewStack[i] );
-      }
-
-      /* Projection matrix - need inv for user clipping in clip space*/
-      gl_matrix_ctr( &ctx->ProjectionMatrix );
-      gl_matrix_alloc_inv( &ctx->ProjectionMatrix );
-
-      gl_matrix_ctr( &ctx->ModelProjectMatrix );
-      gl_matrix_ctr( &ctx->ModelProjectWinMatrix );
-      ctx->ModelProjectWinMatrixUptodate = GL_FALSE;
-
-      ctx->ProjectionStackDepth = 0;
-      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++) {
-        gl_matrix_ctr( &ctx->ProjectionStack[i] );
-        gl_matrix_alloc_inv( &ctx->ProjectionStack[i] );
-      }
-
-      /* Texture matrix */
-      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++) {
-           ctx->TextureStack[i][j].inv = 0;
-        }
-      }
-
-      /* Accumulate buffer group */
-      ASSIGN_4V( ctx->Accum.ClearColor, 0.0, 0.0, 0.0, 0.0 );
-
-      /* Color buffer group */
-      ctx->Color.IndexMask = 0xffffffff;
-      ctx->Color.ColorMask[0] = 0xff;
-      ctx->Color.ColorMask[1] = 0xff;
-      ctx->Color.ColorMask[2] = 0xff;
-      ctx->Color.ColorMask[3] = 0xff;
-      ctx->Color.SWmasking = GL_FALSE;
-      ctx->Color.ClearIndex = 0;
-      ASSIGN_4V( ctx->Color.ClearColor, 0.0, 0.0, 0.0, 0.0 );
-      ctx->Color.DrawBuffer = GL_FRONT;
-      ctx->Color.AlphaEnabled = GL_FALSE;
-      ctx->Color.AlphaFunc = GL_ALWAYS;
-      ctx->Color.AlphaRef = 0;
-      ctx->Color.BlendEnabled = GL_FALSE;
-      ctx->Color.BlendSrcRGB = GL_ONE;
-      ctx->Color.BlendDstRGB = GL_ZERO;
-      ctx->Color.BlendSrcA = GL_ONE;
-      ctx->Color.BlendDstA = GL_ZERO;
-      ctx->Color.BlendEquation = GL_FUNC_ADD_EXT;
-      ctx->Color.BlendFunc = NULL;  /* this pointer set only when needed */
-      ASSIGN_4V( ctx->Color.BlendColor, 0.0, 0.0, 0.0, 0.0 );
-      ctx->Color.IndexLogicOpEnabled = GL_FALSE;
-      ctx->Color.ColorLogicOpEnabled = GL_FALSE;
-      ctx->Color.SWLogicOpEnabled = GL_FALSE;
-      ctx->Color.LogicOp = GL_COPY;
-      ctx->Color.DitherFlag = GL_TRUE;
-      ctx->Color.MultiDrawBuffer = GL_FALSE;
-
-      /* Current group */
-      ASSIGN_4V( ctx->Current.ByteColor, 255, 255, 255, 255);
-      ctx->Current.Index = 1;
-      for (i=0; i<MAX_TEXTURE_UNITS; i++)
-         ASSIGN_4V( ctx->Current.Texcoord[i], 0.0, 0.0, 0.0, 1.0 );
-      ASSIGN_4V( ctx->Current.RasterPos, 0.0, 0.0, 0.0, 1.0 );
-      ctx->Current.RasterDistance = 0.0;
-      ASSIGN_4V( ctx->Current.RasterColor, 1.0, 1.0, 1.0, 1.0 );
-      ctx->Current.RasterIndex = 1;
-      for (i=0; i<MAX_TEXTURE_UNITS; i++)
-         ASSIGN_4V( ctx->Current.RasterMultiTexCoord[i], 0.0, 0.0, 0.0, 1.0 );
-      ctx->Current.RasterTexCoord = ctx->Current.RasterMultiTexCoord[0];
-      ctx->Current.RasterPosValid = GL_TRUE;
-      ctx->Current.EdgeFlag = GL_TRUE;
-      ASSIGN_3V( ctx->Current.Normal, 0.0, 0.0, 1.0 );
-      ctx->Current.Primitive = (GLenum) (GL_POLYGON + 1);
-
-      ctx->Current.Flag = (VERT_NORM|VERT_INDEX|VERT_RGBA|VERT_EDGE|
-                          VERT_TEX0_1|VERT_TEX1_1|VERT_MATERIAL);
-
-      init_fallback_arrays( ctx );
-
-      /* Depth buffer group */
-      ctx->Depth.Test = GL_FALSE;
-      ctx->Depth.Clear = 1.0;
-      ctx->Depth.Func = GL_LESS;
-      ctx->Depth.Mask = GL_TRUE;
-
-      /* Evaluators group */
-      ctx->Eval.Map1Color4 = GL_FALSE;
-      ctx->Eval.Map1Index = GL_FALSE;
-      ctx->Eval.Map1Normal = GL_FALSE;
-      ctx->Eval.Map1TextureCoord1 = GL_FALSE;
-      ctx->Eval.Map1TextureCoord2 = GL_FALSE;
-      ctx->Eval.Map1TextureCoord3 = GL_FALSE;
-      ctx->Eval.Map1TextureCoord4 = GL_FALSE;
-      ctx->Eval.Map1Vertex3 = GL_FALSE;
-      ctx->Eval.Map1Vertex4 = GL_FALSE;
-      ctx->Eval.Map2Color4 = GL_FALSE;
-      ctx->Eval.Map2Index = GL_FALSE;
-      ctx->Eval.Map2Normal = GL_FALSE;
-      ctx->Eval.Map2TextureCoord1 = GL_FALSE;
-      ctx->Eval.Map2TextureCoord2 = GL_FALSE;
-      ctx->Eval.Map2TextureCoord3 = GL_FALSE;
-      ctx->Eval.Map2TextureCoord4 = GL_FALSE;
-      ctx->Eval.Map2Vertex3 = GL_FALSE;
-      ctx->Eval.Map2Vertex4 = GL_FALSE;
-      ctx->Eval.AutoNormal = GL_FALSE;
-      ctx->Eval.MapGrid1un = 1;
-      ctx->Eval.MapGrid1u1 = 0.0;
-      ctx->Eval.MapGrid1u2 = 1.0;
-      ctx->Eval.MapGrid2un = 1;
-      ctx->Eval.MapGrid2vn = 1;
-      ctx->Eval.MapGrid2u1 = 0.0;
-      ctx->Eval.MapGrid2u2 = 1.0;
-      ctx->Eval.MapGrid2v1 = 0.0;
-      ctx->Eval.MapGrid2v2 = 1.0;
-
-      /* Evaluator data */
-      {
-         static GLfloat vertex[4] = { 0.0, 0.0, 0.0, 1.0 };
-         static GLfloat normal[3] = { 0.0, 0.0, 1.0 };
-         static GLfloat index[1] = { 1.0 };
-         static GLfloat color[4] = { 1.0, 1.0, 1.0, 1.0 };
-         static GLfloat texcoord[4] = { 0.0, 0.0, 0.0, 1.0 };
-
-         init_1d_map( &ctx->EvalMap.Map1Vertex3, 3, vertex );
-         init_1d_map( &ctx->EvalMap.Map1Vertex4, 4, vertex );
-         init_1d_map( &ctx->EvalMap.Map1Index, 1, index );
-         init_1d_map( &ctx->EvalMap.Map1Color4, 4, color );
-         init_1d_map( &ctx->EvalMap.Map1Normal, 3, normal );
-         init_1d_map( &ctx->EvalMap.Map1Texture1, 1, texcoord );
-         init_1d_map( &ctx->EvalMap.Map1Texture2, 2, texcoord );
-         init_1d_map( &ctx->EvalMap.Map1Texture3, 3, texcoord );
-         init_1d_map( &ctx->EvalMap.Map1Texture4, 4, texcoord );
-
-         init_2d_map( &ctx->EvalMap.Map2Vertex3, 3, vertex );
-         init_2d_map( &ctx->EvalMap.Map2Vertex4, 4, vertex );
-         init_2d_map( &ctx->EvalMap.Map2Index, 1, index );
-         init_2d_map( &ctx->EvalMap.Map2Color4, 4, color );
-         init_2d_map( &ctx->EvalMap.Map2Normal, 3, normal );
-         init_2d_map( &ctx->EvalMap.Map2Texture1, 1, texcoord );
-         init_2d_map( &ctx->EvalMap.Map2Texture2, 2, texcoord );
-         init_2d_map( &ctx->EvalMap.Map2Texture3, 3, texcoord );
-         init_2d_map( &ctx->EvalMap.Map2Texture4, 4, texcoord );
-      }
-
-      /* Fog group */
-      ctx->Fog.Enabled = GL_FALSE;
-      ctx->Fog.Mode = GL_EXP;
-      ASSIGN_4V( ctx->Fog.Color, 0.0, 0.0, 0.0, 0.0 );
-      ctx->Fog.Index = 0.0;
-      ctx->Fog.Density = 1.0;
-      ctx->Fog.Start = 0.0;
-      ctx->Fog.End = 1.0;
-
-      /* Hint group */
-      ctx->Hint.PerspectiveCorrection = GL_DONT_CARE;
-      ctx->Hint.PointSmooth = GL_DONT_CARE;
-      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.AllowDrawMem = GL_TRUE;
-      ctx->Hint.StrictLighting = GL_TRUE;
-
-      /* Pipeline */
-      gl_pipeline_init( ctx );
-      gl_cva_init( ctx );
-
-      /* Extensions */
-      gl_extensions_ctr( ctx );
-
-      ctx->AllowVertexCull = CLIP_CULLED_BIT;
-
-      /* Lighting group */
-      for (i=0;i<MAX_LIGHTS;i++) {
-        init_light( &ctx->Light.Light[i], i );
-      }
-      make_empty_list( &ctx->Light.EnabledList );
-
-      init_lightmodel( &ctx->Light.Model );
-      init_material( &ctx->Light.Material[0] );
-      init_material( &ctx->Light.Material[1] );
-      ctx->Light.ShadeModel = GL_SMOOTH;
-      ctx->Light.Enabled = GL_FALSE;
-      ctx->Light.ColorMaterialFace = GL_FRONT_AND_BACK;
-      ctx->Light.ColorMaterialMode = GL_AMBIENT_AND_DIFFUSE;
-      ctx->Light.ColorMaterialBitmask
-         = gl_material_bitmask( ctx,
-                               GL_FRONT_AND_BACK,
-                               GL_AMBIENT_AND_DIFFUSE, ~0, 0 );
-
-      ctx->Light.ColorMaterialEnabled = GL_FALSE;
-
-      /* Line group */
-      ctx->Line.SmoothFlag = GL_FALSE;
-      ctx->Line.StippleFlag = GL_FALSE;
-      ctx->Line.Width = 1.0;
-      ctx->Line.StipplePattern = 0xffff;
-      ctx->Line.StippleFactor = 1;
-
-      /* Display List group */
-      ctx->List.ListBase = 0;
-
-      /* Pixel group */
-      ctx->Pixel.RedBias = 0.0;
-      ctx->Pixel.RedScale = 1.0;
-      ctx->Pixel.GreenBias = 0.0;
-      ctx->Pixel.GreenScale = 1.0;
-      ctx->Pixel.BlueBias = 0.0;
-      ctx->Pixel.BlueScale = 1.0;
-      ctx->Pixel.AlphaBias = 0.0;
-      ctx->Pixel.AlphaScale = 1.0;
-      ctx->Pixel.ScaleOrBiasRGBA = GL_FALSE;
-      ctx->Pixel.DepthBias = 0.0;
-      ctx->Pixel.DepthScale = 1.0;
-      ctx->Pixel.IndexOffset = 0;
-      ctx->Pixel.IndexShift = 0;
-      ctx->Pixel.ZoomX = 1.0;
-      ctx->Pixel.ZoomY = 1.0;
-      ctx->Pixel.MapColorFlag = GL_FALSE;
-      ctx->Pixel.MapStencilFlag = GL_FALSE;
-      ctx->Pixel.MapStoSsize = 1;
-      ctx->Pixel.MapItoIsize = 1;
-      ctx->Pixel.MapItoRsize = 1;
-      ctx->Pixel.MapItoGsize = 1;
-      ctx->Pixel.MapItoBsize = 1;
-      ctx->Pixel.MapItoAsize = 1;
-      ctx->Pixel.MapRtoRsize = 1;
-      ctx->Pixel.MapGtoGsize = 1;
-      ctx->Pixel.MapBtoBsize = 1;
-      ctx->Pixel.MapAtoAsize = 1;
-      ctx->Pixel.MapStoS[0] = 0;
-      ctx->Pixel.MapItoI[0] = 0;
-      ctx->Pixel.MapItoR[0] = 0.0;
-      ctx->Pixel.MapItoG[0] = 0.0;
-      ctx->Pixel.MapItoB[0] = 0.0;
-      ctx->Pixel.MapItoA[0] = 0.0;
-      ctx->Pixel.MapItoR8[0] = 0;
-      ctx->Pixel.MapItoG8[0] = 0;
-      ctx->Pixel.MapItoB8[0] = 0;
-      ctx->Pixel.MapItoA8[0] = 0;
-      ctx->Pixel.MapRtoR[0] = 0.0;
-      ctx->Pixel.MapGtoG[0] = 0.0;
-      ctx->Pixel.MapBtoB[0] = 0.0;
-      ctx->Pixel.MapAtoA[0] = 0.0;
-
-      /* Point group */
-      ctx->Point.SmoothFlag = GL_FALSE;
-      ctx->Point.Size = 1.0;
-      ctx->Point.Params[0] = 1.0;
-      ctx->Point.Params[1] = 0.0;
-      ctx->Point.Params[2] = 0.0;
-      ctx->Point.Attenuated = GL_FALSE;
-      ctx->Point.MinSize = 0.0;
-      ctx->Point.MaxSize = (GLfloat) MAX_POINT_SIZE;
-      ctx->Point.Threshold = 1.0;
-
-      /* Polygon group */
-      ctx->Polygon.CullFlag = GL_FALSE;
-      ctx->Polygon.CullFaceMode = GL_BACK;
-      ctx->Polygon.FrontFace = GL_CCW;
-      ctx->Polygon.FrontBit = 0;
-      ctx->Polygon.FrontMode = GL_FILL;
-      ctx->Polygon.BackMode = GL_FILL;
-      ctx->Polygon.Unfilled = GL_FALSE;
-      ctx->Polygon.SmoothFlag = GL_FALSE;
-      ctx->Polygon.StippleFlag = GL_FALSE;
-      ctx->Polygon.OffsetFactor = 0.0F;
-      ctx->Polygon.OffsetUnits = 0.0F;
-      ctx->Polygon.OffsetPoint = GL_FALSE;
-      ctx->Polygon.OffsetLine = GL_FALSE;
-      ctx->Polygon.OffsetFill = GL_FALSE;
-
-      /* Polygon Stipple group */
-      MEMSET( ctx->PolygonStipple, 0xff, 32*sizeof(GLuint) );
-
-      /* Scissor group */
-      ctx->Scissor.Enabled = GL_FALSE;
-      ctx->Scissor.X = 0;
-      ctx->Scissor.Y = 0;
-      ctx->Scissor.Width = 0;
-      ctx->Scissor.Height = 0;
-
-      /* Stencil group */
-      ctx->Stencil.Enabled = GL_FALSE;
-      ctx->Stencil.Function = GL_ALWAYS;
-      ctx->Stencil.FailFunc = GL_KEEP;
-      ctx->Stencil.ZPassFunc = GL_KEEP;
-      ctx->Stencil.ZFailFunc = GL_KEEP;
-      ctx->Stencil.Ref = 0;
-      ctx->Stencil.ValueMask = STENCIL_MAX;
-      ctx->Stencil.Clear = 0;
-      ctx->Stencil.WriteMask = STENCIL_MAX;
-
-      /* Texture group */
-      ctx->Texture.CurrentUnit = 0;      /* multitexture */
-      ctx->Texture.CurrentTransformUnit = 0; /* multitexture */
-      ctx->Texture.Enabled = 0;
-
-      for (i=0; i<MAX_TEXTURE_UNITS; i++)
-         init_texture_unit( ctx, i );
-
-      init_color_table(&ctx->Texture.Palette);
-
-      /* Transformation group */
-      ctx->Transform.MatrixMode = GL_MODELVIEW;
-      ctx->Transform.Normalize = GL_FALSE;
-      ctx->Transform.RescaleNormals = GL_FALSE;
-      for (i=0;i<MAX_CLIP_PLANES;i++) {
-        ctx->Transform.ClipEnabled[i] = GL_FALSE;
-         ASSIGN_4V( ctx->Transform.EyeUserPlane[i], 0.0, 0.0, 0.0, 0.0 );
-      }
-      ctx->Transform.AnyClip = GL_FALSE;
-
-      /* Viewport group */
-      ctx->Viewport.X = 0;
-      ctx->Viewport.Y = 0;
-      ctx->Viewport.Width = 0;
-      ctx->Viewport.Height = 0;
-      ctx->Viewport.Near = 0.0;
-      ctx->Viewport.Far = 1.0;
-      gl_matrix_ctr(&ctx->Viewport.WindowMap);
-
-#define Sz 10
-#define Tz 14
-      ctx->Viewport.WindowMap.m[Sz] = 0.5 * DEPTH_SCALE;
-      ctx->Viewport.WindowMap.m[Tz] = 0.5 * DEPTH_SCALE;
-#undef Sz
-#undef Tz
-
-      ctx->Viewport.WindowMap.flags = MAT_FLAG_GENERAL_SCALE|MAT_FLAG_TRANSLATION;
-      ctx->Viewport.WindowMap.type = MATRIX_3D_NO_ROT;
-
-      /* Vertex arrays */
-      ctx->Array.Vertex.Size = 4;
-      ctx->Array.Vertex.Type = GL_FLOAT;
-      ctx->Array.Vertex.Stride = 0;
-      ctx->Array.Vertex.StrideB = 0;
-      ctx->Array.Vertex.Ptr = NULL;
-      ctx->Array.Vertex.Enabled = GL_FALSE;
-      ctx->Array.Normal.Type = GL_FLOAT;
-      ctx->Array.Normal.Stride = 0;
-      ctx->Array.Normal.StrideB = 0;
-      ctx->Array.Normal.Ptr = NULL;
-      ctx->Array.Normal.Enabled = GL_FALSE;
-      ctx->Array.Color.Size = 4;
-      ctx->Array.Color.Type = GL_FLOAT;
-      ctx->Array.Color.Stride = 0;
-      ctx->Array.Color.StrideB = 0;
-      ctx->Array.Color.Ptr = NULL;
-      ctx->Array.Color.Enabled = GL_FALSE;
-      ctx->Array.Index.Type = GL_FLOAT;
-      ctx->Array.Index.Stride = 0;
-      ctx->Array.Index.StrideB = 0;
-      ctx->Array.Index.Ptr = NULL;
-      ctx->Array.Index.Enabled = GL_FALSE;
-      for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
-         ctx->Array.TexCoord[i].Size = 4;
-         ctx->Array.TexCoord[i].Type = GL_FLOAT;
-         ctx->Array.TexCoord[i].Stride = 0;
-         ctx->Array.TexCoord[i].StrideB = 0;
-         ctx->Array.TexCoord[i].Ptr = NULL;
-         ctx->Array.TexCoord[i].Enabled = GL_FALSE;
-      }
-      ctx->Array.TexCoordInterleaveFactor = 1;
-      ctx->Array.EdgeFlag.Stride = 0;
-      ctx->Array.EdgeFlag.StrideB = 0;
-      ctx->Array.EdgeFlag.Ptr = NULL;
-      ctx->Array.EdgeFlag.Enabled = GL_FALSE;
-      ctx->Array.ActiveTexture = 0;   /* GL_ARB_multitexture */
-
-      /* Pixel transfer */
-      ctx->Pack.Alignment = 4;
-      ctx->Pack.RowLength = 0;
-      ctx->Pack.ImageHeight = 0;
-      ctx->Pack.SkipPixels = 0;
-      ctx->Pack.SkipRows = 0;
-      ctx->Pack.SkipImages = 0;
-      ctx->Pack.SwapBytes = GL_FALSE;
-      ctx->Pack.LsbFirst = GL_FALSE;
-      ctx->Unpack.Alignment = 4;
-      ctx->Unpack.RowLength = 0;
-      ctx->Unpack.ImageHeight = 0;
-      ctx->Unpack.SkipPixels = 0;
-      ctx->Unpack.SkipRows = 0;
-      ctx->Unpack.SkipImages = 0;
-      ctx->Unpack.SwapBytes = GL_FALSE;
-      ctx->Unpack.LsbFirst = GL_FALSE;
-
-      /* Feedback */
-      ctx->Feedback.Type = GL_2D;   /* TODO: verify */
-      ctx->Feedback.Buffer = NULL;
-      ctx->Feedback.BufferSize = 0;
-      ctx->Feedback.Count = 0;
-
-      /* Selection/picking */
-      ctx->Select.Buffer = NULL;
-      ctx->Select.BufferSize = 0;
-      ctx->Select.BufferCount = 0;
-      ctx->Select.Hits = 0;
-      ctx->Select.NameStackDepth = 0;
-
-      /* Optimized Accum buffer */
-      ctx->IntegerAccumMode = GL_TRUE;
-      ctx->IntegerAccumScaler = 0.0;
-
-      /* Renderer and client attribute stacks */
-      ctx->AttribStackDepth = 0;
-      ctx->ClientAttribStackDepth = 0;
-
-      /*** Miscellaneous ***/
-      ctx->NewState = NEW_ALL;
-      ctx->RenderMode = GL_RENDER;
-      ctx->StippleCounter = 0;
-      ctx->NeedNormals = GL_FALSE;
-      ctx->DoViewportMapping = GL_TRUE;
-
-      ctx->NeedEyeCoords = GL_FALSE;
-      ctx->NeedEyeNormals = GL_FALSE;
-      ctx->vb_proj_matrix = &ctx->ModelProjectMatrix;
+   assert(ctx);
 
-      /* 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;
+   /* Constants, may be overriden by device driver */
+   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->ErrorValue = (GLenum) GL_NO_ERROR;
+   /* Modelview matrix */
+   gl_matrix_ctr( &ctx->ModelView );
+   gl_matrix_alloc_inv( &ctx->ModelView );
 
-      ctx->CatchSignals = GL_TRUE;
-
-      /* For debug/development only */
-      ctx->NoRaster = getenv("MESA_NO_RASTER") ? GL_TRUE : GL_FALSE;
-      ctx->FirstTimeCurrent = GL_TRUE;
-
-      /* Dither disable */
-      ctx->NoDither = getenv("MESA_NO_DITHER") ? GL_TRUE : GL_FALSE;
-      if (ctx->NoDither) {
-         if (getenv("MESA_DEBUG")) {
-            fprintf(stderr, "MESA_NO_DITHER set - dithering disabled\n");
-         }
-         ctx->Color.DitherFlag = GL_FALSE;
-      }
+   ctx->ModelViewStackDepth = 0;
+   for (i = 0 ; i < MAX_MODELVIEW_STACK_DEPTH ; i++) {
+      gl_matrix_ctr( &ctx->ModelViewStack[i] );
+      gl_matrix_alloc_inv( &ctx->ModelViewStack[i] );
    }
-}
 
+   /* Projection matrix - need inv for user clipping in clip space*/
+   gl_matrix_ctr( &ctx->ProjectionMatrix );
+   gl_matrix_alloc_inv( &ctx->ProjectionMatrix );
 
+   gl_matrix_ctr( &ctx->ModelProjectMatrix );
+   gl_matrix_ctr( &ctx->ModelProjectWinMatrix );
+   ctx->ModelProjectWinMatrixUptodate = GL_FALSE;
 
-/*
- * 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 (stencilBits > (GLint) (8*sizeof(GLstencil))) {
-      /* can't meet stencil buffer requirements */
-      return NULL;
-   }
-   if (accumBits > (GLint) (8*sizeof(GLaccum))) {
-      /* can't meet accum buffer requirements */
-      return NULL;
-   }
+   ctx->ProjectionStackDepth = 0;
+   ctx->NearFarStack[0][0] = 1.0; /* These values seem weird by make */
+   ctx->NearFarStack[0][1] = 0.0; /* sense mathematically. */
 
-   vis = (GLvisual *) CALLOC( sizeof(GLvisual) );
-   if (!vis) {
-      return NULL;
+   for (i = 0 ; i < MAX_PROJECTION_STACK_DEPTH ; i++) {
+      gl_matrix_ctr( &ctx->ProjectionStack[i] );
+      gl_matrix_alloc_inv( &ctx->ProjectionStack[i] );
    }
 
-   vis->RGBAflag   = rgbFlag;
-   vis->DBflag     = dbFlag;
-   vis->StereoFlag = stereoFlag;
-   vis->RedBits    = redBits;
-   vis->GreenBits  = greenBits;
-   vis->BlueBits   = blueBits;
-   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->SoftwareAlpha = alphaFlag;
-
-   return vis;
-}
-
-
-
-void gl_destroy_visual( GLvisual *vis )
-{
-   FREE( vis );
-}
-
-
-
-
-/*
- * Create a new framebuffer.  A GLframebuffer is a struct which
- * encapsulates the depth, stencil and accum buffers and related
- * parameters.
- * Input:  visual - a GLvisual pointer
- *         softwareDepth - create/use a software depth buffer?
- *         softwareStencil - create/use a software stencil buffer?
- *         softwareAccum - create/use a software accum buffer?
- *         softwareAlpha - create/use a software alpha buffer?
-
- * 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 *buffer;
-
-   buffer = CALLOC_STRUCT(gl_frame_buffer);
-   if (!buffer) {
-      return NULL;
+   /* Texture matrix */
+   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++) {
+         ctx->TextureStack[i][j].inv = 0;
+      }
    }
 
-   /* sanity checks */
-   if (softwareDepth ) {
-      assert(visual->DepthBits > 0);
-   }
-   if (softwareStencil) {
-      assert(visual->StencilBits > 0);
-   }
-   if (softwareAccum) {
-      assert(visual->RGBAflag);
-      assert(visual->AccumBits > 0);
+   /* Accumulate buffer group */
+   ASSIGN_4V( ctx->Accum.ClearColor, 0.0, 0.0, 0.0, 0.0 );
+
+   /* Color buffer group */
+   ctx->Color.IndexMask = 0xffffffff;
+   ctx->Color.ColorMask[0] = 0xff;
+   ctx->Color.ColorMask[1] = 0xff;
+   ctx->Color.ColorMask[2] = 0xff;
+   ctx->Color.ColorMask[3] = 0xff;
+   ctx->Color.SWmasking = GL_FALSE;
+   ctx->Color.ClearIndex = 0;
+   ASSIGN_4V( ctx->Color.ClearColor, 0.0, 0.0, 0.0, 0.0 );
+   ctx->Color.DrawBuffer = GL_FRONT;
+   ctx->Color.AlphaEnabled = GL_FALSE;
+   ctx->Color.AlphaFunc = GL_ALWAYS;
+   ctx->Color.AlphaRef = 0;
+   ctx->Color.BlendEnabled = GL_FALSE;
+   ctx->Color.BlendSrcRGB = GL_ONE;
+   ctx->Color.BlendDstRGB = GL_ZERO;
+   ctx->Color.BlendSrcA = GL_ONE;
+   ctx->Color.BlendDstA = GL_ZERO;
+   ctx->Color.BlendEquation = GL_FUNC_ADD_EXT;
+   ctx->Color.BlendFunc = NULL;  /* this pointer set only when needed */
+   ASSIGN_4V( ctx->Color.BlendColor, 0.0, 0.0, 0.0, 0.0 );
+   ctx->Color.IndexLogicOpEnabled = GL_FALSE;
+   ctx->Color.ColorLogicOpEnabled = GL_FALSE;
+   ctx->Color.SWLogicOpEnabled = GL_FALSE;
+   ctx->Color.LogicOp = GL_COPY;
+   ctx->Color.DitherFlag = GL_TRUE;
+   ctx->Color.MultiDrawBuffer = GL_FALSE;
+
+   /* Current group */
+   ASSIGN_4V( ctx->Current.ByteColor, 255, 255, 255, 255);
+   ctx->Current.Index = 1;
+   for (i=0; i<MAX_TEXTURE_UNITS; i++)
+      ASSIGN_4V( ctx->Current.Texcoord[i], 0.0, 0.0, 0.0, 1.0 );
+   ASSIGN_4V( ctx->Current.RasterPos, 0.0, 0.0, 0.0, 1.0 );
+   ctx->Current.RasterDistance = 0.0;
+   ASSIGN_4V( ctx->Current.RasterColor, 1.0, 1.0, 1.0, 1.0 );
+   ctx->Current.RasterIndex = 1;
+   for (i=0; i<MAX_TEXTURE_UNITS; i++)
+      ASSIGN_4V( ctx->Current.RasterMultiTexCoord[i], 0.0, 0.0, 0.0, 1.0 );
+   ctx->Current.RasterTexCoord = ctx->Current.RasterMultiTexCoord[0];
+   ctx->Current.RasterPosValid = GL_TRUE;
+   ctx->Current.EdgeFlag = GL_TRUE;
+   ASSIGN_3V( ctx->Current.Normal, 0.0, 0.0, 1.0 );
+   ctx->Current.Primitive = (GLenum) (GL_POLYGON + 1);
+
+   ctx->Current.Flag = (VERT_NORM|VERT_INDEX|VERT_RGBA|VERT_EDGE|
+                        VERT_TEX0_1|VERT_TEX1_1|VERT_MATERIAL);
+
+   init_fallback_arrays( ctx );
+
+   /* Depth buffer group */
+   ctx->Depth.Test = GL_FALSE;
+   ctx->Depth.Clear = 1.0;
+   ctx->Depth.Func = GL_LESS;
+   ctx->Depth.Mask = GL_TRUE;
+
+   /* Evaluators group */
+   ctx->Eval.Map1Color4 = GL_FALSE;
+   ctx->Eval.Map1Index = GL_FALSE;
+   ctx->Eval.Map1Normal = GL_FALSE;
+   ctx->Eval.Map1TextureCoord1 = GL_FALSE;
+   ctx->Eval.Map1TextureCoord2 = GL_FALSE;
+   ctx->Eval.Map1TextureCoord3 = GL_FALSE;
+   ctx->Eval.Map1TextureCoord4 = GL_FALSE;
+   ctx->Eval.Map1Vertex3 = GL_FALSE;
+   ctx->Eval.Map1Vertex4 = GL_FALSE;
+   ctx->Eval.Map2Color4 = GL_FALSE;
+   ctx->Eval.Map2Index = GL_FALSE;
+   ctx->Eval.Map2Normal = GL_FALSE;
+   ctx->Eval.Map2TextureCoord1 = GL_FALSE;
+   ctx->Eval.Map2TextureCoord2 = GL_FALSE;
+   ctx->Eval.Map2TextureCoord3 = GL_FALSE;
+   ctx->Eval.Map2TextureCoord4 = GL_FALSE;
+   ctx->Eval.Map2Vertex3 = GL_FALSE;
+   ctx->Eval.Map2Vertex4 = GL_FALSE;
+   ctx->Eval.AutoNormal = GL_FALSE;
+   ctx->Eval.MapGrid1un = 1;
+   ctx->Eval.MapGrid1u1 = 0.0;
+   ctx->Eval.MapGrid1u2 = 1.0;
+   ctx->Eval.MapGrid2un = 1;
+   ctx->Eval.MapGrid2vn = 1;
+   ctx->Eval.MapGrid2u1 = 0.0;
+   ctx->Eval.MapGrid2u2 = 1.0;
+   ctx->Eval.MapGrid2v1 = 0.0;
+   ctx->Eval.MapGrid2v2 = 1.0;
+
+   /* Evaluator data */
+   {
+      static GLfloat vertex[4] = { 0.0, 0.0, 0.0, 1.0 };
+      static GLfloat normal[3] = { 0.0, 0.0, 1.0 };
+      static GLfloat index[1] = { 1.0 };
+      static GLfloat color[4] = { 1.0, 1.0, 1.0, 1.0 };
+      static GLfloat texcoord[4] = { 0.0, 0.0, 0.0, 1.0 };
+
+      init_1d_map( &ctx->EvalMap.Map1Vertex3, 3, vertex );
+      init_1d_map( &ctx->EvalMap.Map1Vertex4, 4, vertex );
+      init_1d_map( &ctx->EvalMap.Map1Index, 1, index );
+      init_1d_map( &ctx->EvalMap.Map1Color4, 4, color );
+      init_1d_map( &ctx->EvalMap.Map1Normal, 3, normal );
+      init_1d_map( &ctx->EvalMap.Map1Texture1, 1, texcoord );
+      init_1d_map( &ctx->EvalMap.Map1Texture2, 2, texcoord );
+      init_1d_map( &ctx->EvalMap.Map1Texture3, 3, texcoord );
+      init_1d_map( &ctx->EvalMap.Map1Texture4, 4, texcoord );
+
+      init_2d_map( &ctx->EvalMap.Map2Vertex3, 3, vertex );
+      init_2d_map( &ctx->EvalMap.Map2Vertex4, 4, vertex );
+      init_2d_map( &ctx->EvalMap.Map2Index, 1, index );
+      init_2d_map( &ctx->EvalMap.Map2Color4, 4, color );
+      init_2d_map( &ctx->EvalMap.Map2Normal, 3, normal );
+      init_2d_map( &ctx->EvalMap.Map2Texture1, 1, texcoord );
+      init_2d_map( &ctx->EvalMap.Map2Texture2, 2, texcoord );
+      init_2d_map( &ctx->EvalMap.Map2Texture3, 3, texcoord );
+      init_2d_map( &ctx->EvalMap.Map2Texture4, 4, texcoord );
+   }
+
+   /* Fog group */
+   ctx->Fog.Enabled = GL_FALSE;
+   ctx->Fog.Mode = GL_EXP;
+   ASSIGN_4V( ctx->Fog.Color, 0.0, 0.0, 0.0, 0.0 );
+   ctx->Fog.Index = 0.0;
+   ctx->Fog.Density = 1.0;
+   ctx->Fog.Start = 0.0;
+   ctx->Fog.End = 1.0;
+
+   /* Hint group */
+   ctx->Hint.PerspectiveCorrection = GL_DONT_CARE;
+   ctx->Hint.PointSmooth = GL_DONT_CARE;
+   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.AllowDrawMem = GL_TRUE;
+   ctx->Hint.StrictLighting = GL_TRUE;
+
+   /* Pipeline */
+   gl_pipeline_init( ctx );
+   gl_cva_init( ctx );
+
+   /* Extensions */
+   gl_extensions_ctr( ctx );
+
+   ctx->AllowVertexCull = CLIP_CULLED_BIT;
+
+   /* Lighting group */
+   for (i=0;i<MAX_LIGHTS;i++) {
+      init_light( &ctx->Light.Light[i], i );
+   }
+   make_empty_list( &ctx->Light.EnabledList );
+
+   init_lightmodel( &ctx->Light.Model );
+   init_material( &ctx->Light.Material[0] );
+   init_material( &ctx->Light.Material[1] );
+   ctx->Light.ShadeModel = GL_SMOOTH;
+   ctx->Light.Enabled = GL_FALSE;
+   ctx->Light.ColorMaterialFace = GL_FRONT_AND_BACK;
+   ctx->Light.ColorMaterialMode = GL_AMBIENT_AND_DIFFUSE;
+   ctx->Light.ColorMaterialBitmask
+      = gl_material_bitmask( ctx,
+                             GL_FRONT_AND_BACK,
+                             GL_AMBIENT_AND_DIFFUSE, ~0, 0 );
+
+   ctx->Light.ColorMaterialEnabled = GL_FALSE;
+
+   /* Lighting miscellaneous */
+   ctx->ShineTabList = MALLOC_STRUCT( gl_shine_tab );
+   make_empty_list( ctx->ShineTabList );
+   for (i = 0 ; i < 10 ; i++) {
+      struct gl_shine_tab *s = MALLOC_STRUCT( gl_shine_tab );
+      s->shininess = -1;
+      s->refcount = 0;
+      insert_at_tail( ctx->ShineTabList, s );
    }
-   if (softwareAlpha) {
-      assert(visual->RGBAflag);
-      assert(visual->AlphaBits > 0);
+   for (i = 0 ; i < 4 ; i++) {
+      ctx->ShineTable[i] = ctx->ShineTabList->prev;
+      ctx->ShineTable[i]->refcount++;
    }
 
-   buffer->Visual = visual;
-   buffer->UseSoftwareDepthBuffer = softwareDepth;
-   buffer->UseSoftwareStencilBuffer = softwareStencil;
-   buffer->UseSoftwareAccumBuffer = softwareAccum;
-   buffer->UseSoftwareAlphaBuffers = softwareAlpha;
-
-   return buffer;
-}
 
+   /* Line group */
+   ctx->Line.SmoothFlag = GL_FALSE;
+   ctx->Line.StippleFlag = GL_FALSE;
+   ctx->Line.Width = 1.0;
+   ctx->Line.StipplePattern = 0xffff;
+   ctx->Line.StippleFactor = 1;
+
+   /* Display List group */
+   ctx->List.ListBase = 0;
+
+   /* Pixel group */
+   ctx->Pixel.RedBias = 0.0;
+   ctx->Pixel.RedScale = 1.0;
+   ctx->Pixel.GreenBias = 0.0;
+   ctx->Pixel.GreenScale = 1.0;
+   ctx->Pixel.BlueBias = 0.0;
+   ctx->Pixel.BlueScale = 1.0;
+   ctx->Pixel.AlphaBias = 0.0;
+   ctx->Pixel.AlphaScale = 1.0;
+   ctx->Pixel.ScaleOrBiasRGBA = GL_FALSE;
+   ctx->Pixel.DepthBias = 0.0;
+   ctx->Pixel.DepthScale = 1.0;
+   ctx->Pixel.IndexOffset = 0;
+   ctx->Pixel.IndexShift = 0;
+   ctx->Pixel.ZoomX = 1.0;
+   ctx->Pixel.ZoomY = 1.0;
+   ctx->Pixel.MapColorFlag = GL_FALSE;
+   ctx->Pixel.MapStencilFlag = GL_FALSE;
+   ctx->Pixel.MapStoSsize = 1;
+   ctx->Pixel.MapItoIsize = 1;
+   ctx->Pixel.MapItoRsize = 1;
+   ctx->Pixel.MapItoGsize = 1;
+   ctx->Pixel.MapItoBsize = 1;
+   ctx->Pixel.MapItoAsize = 1;
+   ctx->Pixel.MapRtoRsize = 1;
+   ctx->Pixel.MapGtoGsize = 1;
+   ctx->Pixel.MapBtoBsize = 1;
+   ctx->Pixel.MapAtoAsize = 1;
+   ctx->Pixel.MapStoS[0] = 0;
+   ctx->Pixel.MapItoI[0] = 0;
+   ctx->Pixel.MapItoR[0] = 0.0;
+   ctx->Pixel.MapItoG[0] = 0.0;
+   ctx->Pixel.MapItoB[0] = 0.0;
+   ctx->Pixel.MapItoA[0] = 0.0;
+   ctx->Pixel.MapItoR8[0] = 0;
+   ctx->Pixel.MapItoG8[0] = 0;
+   ctx->Pixel.MapItoB8[0] = 0;
+   ctx->Pixel.MapItoA8[0] = 0;
+   ctx->Pixel.MapRtoR[0] = 0.0;
+   ctx->Pixel.MapGtoG[0] = 0.0;
+   ctx->Pixel.MapBtoB[0] = 0.0;
+   ctx->Pixel.MapAtoA[0] = 0.0;
+
+   /* Point group */
+   ctx->Point.SmoothFlag = GL_FALSE;
+   ctx->Point.Size = 1.0;
+   ctx->Point.Params[0] = 1.0;
+   ctx->Point.Params[1] = 0.0;
+   ctx->Point.Params[2] = 0.0;
+   ctx->Point.Attenuated = GL_FALSE;
+   ctx->Point.MinSize = 0.0;
+   ctx->Point.MaxSize = (GLfloat) MAX_POINT_SIZE;
+   ctx->Point.Threshold = 1.0;
+
+   /* Polygon group */
+   ctx->Polygon.CullFlag = GL_FALSE;
+   ctx->Polygon.CullFaceMode = GL_BACK;
+   ctx->Polygon.FrontFace = GL_CCW;
+   ctx->Polygon.FrontBit = 0;
+   ctx->Polygon.FrontMode = GL_FILL;
+   ctx->Polygon.BackMode = GL_FILL;
+   ctx->Polygon.Unfilled = GL_FALSE;
+   ctx->Polygon.SmoothFlag = GL_FALSE;
+   ctx->Polygon.StippleFlag = GL_FALSE;
+   ctx->Polygon.OffsetFactor = 0.0F;
+   ctx->Polygon.OffsetUnits = 0.0F;
+   ctx->Polygon.OffsetPoint = GL_FALSE;
+   ctx->Polygon.OffsetLine = GL_FALSE;
+   ctx->Polygon.OffsetFill = GL_FALSE;
+
+   /* Polygon Stipple group */
+   MEMSET( ctx->PolygonStipple, 0xff, 32*sizeof(GLuint) );
+
+   /* Scissor group */
+   ctx->Scissor.Enabled = GL_FALSE;
+   ctx->Scissor.X = 0;
+   ctx->Scissor.Y = 0;
+   ctx->Scissor.Width = 0;
+   ctx->Scissor.Height = 0;
+
+   /* Stencil group */
+   ctx->Stencil.Enabled = GL_FALSE;
+   ctx->Stencil.Function = GL_ALWAYS;
+   ctx->Stencil.FailFunc = GL_KEEP;
+   ctx->Stencil.ZPassFunc = GL_KEEP;
+   ctx->Stencil.ZFailFunc = GL_KEEP;
+   ctx->Stencil.Ref = 0;
+   ctx->Stencil.ValueMask = STENCIL_MAX;
+   ctx->Stencil.Clear = 0;
+   ctx->Stencil.WriteMask = STENCIL_MAX;
+
+   /* Texture group */
+   ctx->Texture.CurrentUnit = 0;      /* multitexture */
+   ctx->Texture.CurrentTransformUnit = 0; /* multitexture */
+   ctx->Texture.Enabled = 0;
+   for (i=0; i<MAX_TEXTURE_UNITS; i++)
+      init_texture_unit( ctx, i );
+   init_color_table(&ctx->Texture.Palette);
+
+   /* Transformation group */
+   ctx->Transform.MatrixMode = GL_MODELVIEW;
+   ctx->Transform.Normalize = GL_FALSE;
+   ctx->Transform.RescaleNormals = GL_FALSE;
+   for (i=0;i<MAX_CLIP_PLANES;i++) {
+      ctx->Transform.ClipEnabled[i] = GL_FALSE;
+      ASSIGN_4V( ctx->Transform.EyeUserPlane[i], 0.0, 0.0, 0.0, 0.0 );
+   }
+   ctx->Transform.AnyClip = GL_FALSE;
+
+   /* Viewport group */
+   ctx->Viewport.X = 0;
+   ctx->Viewport.Y = 0;
+   ctx->Viewport.Width = 0;
+   ctx->Viewport.Height = 0;
+   ctx->Viewport.Near = 0.0;
+   ctx->Viewport.Far = 1.0;
+   gl_matrix_ctr(&ctx->Viewport.WindowMap);
 
+#define Sz 10
+#define Tz 14
+   ctx->Viewport.WindowMap.m[Sz] = 0.5 * DEPTH_SCALE;
+   ctx->Viewport.WindowMap.m[Tz] = 0.5 * DEPTH_SCALE;
+#undef Sz
+#undef Tz
 
-/*
- * Free a framebuffer struct and its buffers.
- */
-void gl_destroy_framebuffer( GLframebuffer *buffer )
-{
-   if (buffer) {
-      if (buffer->Depth) {
-         FREE( buffer->Depth );
-      }
-      if (buffer->Accum) {
-         FREE( buffer->Accum );
-      }
-      if (buffer->Stencil) {
-         FREE( buffer->Stencil );
-      }
-      if (buffer->FrontLeftAlpha) {
-         FREE( buffer->FrontLeftAlpha );
-      }
-      if (buffer->BackLeftAlpha) {
-         FREE( buffer->BackLeftAlpha );
-      }
-      if (buffer->FrontRightAlpha) {
-         FREE( buffer->FrontRightAlpha );
-      }
-      if (buffer->BackRightAlpha) {
-         FREE( buffer->BackRightAlpha );
+   ctx->Viewport.WindowMap.flags = MAT_FLAG_GENERAL_SCALE|MAT_FLAG_TRANSLATION;
+   ctx->Viewport.WindowMap.type = MATRIX_3D_NO_ROT;
+
+   /* Vertex arrays */
+   ctx->Array.Vertex.Size = 4;
+   ctx->Array.Vertex.Type = GL_FLOAT;
+   ctx->Array.Vertex.Stride = 0;
+   ctx->Array.Vertex.StrideB = 0;
+   ctx->Array.Vertex.Ptr = NULL;
+   ctx->Array.Vertex.Enabled = GL_FALSE;
+   ctx->Array.Normal.Type = GL_FLOAT;
+   ctx->Array.Normal.Stride = 0;
+   ctx->Array.Normal.StrideB = 0;
+   ctx->Array.Normal.Ptr = NULL;
+   ctx->Array.Normal.Enabled = GL_FALSE;
+   ctx->Array.Color.Size = 4;
+   ctx->Array.Color.Type = GL_FLOAT;
+   ctx->Array.Color.Stride = 0;
+   ctx->Array.Color.StrideB = 0;
+   ctx->Array.Color.Ptr = NULL;
+   ctx->Array.Color.Enabled = GL_FALSE;
+   ctx->Array.Index.Type = GL_FLOAT;
+   ctx->Array.Index.Stride = 0;
+   ctx->Array.Index.StrideB = 0;
+   ctx->Array.Index.Ptr = NULL;
+   ctx->Array.Index.Enabled = GL_FALSE;
+   for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
+      ctx->Array.TexCoord[i].Size = 4;
+      ctx->Array.TexCoord[i].Type = GL_FLOAT;
+      ctx->Array.TexCoord[i].Stride = 0;
+      ctx->Array.TexCoord[i].StrideB = 0;
+      ctx->Array.TexCoord[i].Ptr = NULL;
+      ctx->Array.TexCoord[i].Enabled = GL_FALSE;
+   }
+   ctx->Array.TexCoordInterleaveFactor = 1;
+   ctx->Array.EdgeFlag.Stride = 0;
+   ctx->Array.EdgeFlag.StrideB = 0;
+   ctx->Array.EdgeFlag.Ptr = NULL;
+   ctx->Array.EdgeFlag.Enabled = GL_FALSE;
+   ctx->Array.ActiveTexture = 0;   /* GL_ARB_multitexture */
+
+   /* Pixel transfer */
+   ctx->Pack.Alignment = 4;
+   ctx->Pack.RowLength = 0;
+   ctx->Pack.ImageHeight = 0;
+   ctx->Pack.SkipPixels = 0;
+   ctx->Pack.SkipRows = 0;
+   ctx->Pack.SkipImages = 0;
+   ctx->Pack.SwapBytes = GL_FALSE;
+   ctx->Pack.LsbFirst = GL_FALSE;
+   ctx->Unpack.Alignment = 4;
+   ctx->Unpack.RowLength = 0;
+   ctx->Unpack.ImageHeight = 0;
+   ctx->Unpack.SkipPixels = 0;
+   ctx->Unpack.SkipRows = 0;
+   ctx->Unpack.SkipImages = 0;
+   ctx->Unpack.SwapBytes = GL_FALSE;
+   ctx->Unpack.LsbFirst = GL_FALSE;
+
+   /* Feedback */
+   ctx->Feedback.Type = GL_2D;   /* TODO: verify */
+   ctx->Feedback.Buffer = NULL;
+   ctx->Feedback.BufferSize = 0;
+   ctx->Feedback.Count = 0;
+
+   /* Selection/picking */
+   ctx->Select.Buffer = NULL;
+   ctx->Select.BufferSize = 0;
+   ctx->Select.BufferCount = 0;
+   ctx->Select.Hits = 0;
+   ctx->Select.NameStackDepth = 0;
+
+   /* Optimized Accum buffer */
+   ctx->IntegerAccumMode = GL_TRUE;
+   ctx->IntegerAccumScaler = 0.0;
+
+   /* Renderer and client attribute stacks */
+   ctx->AttribStackDepth = 0;
+   ctx->ClientAttribStackDepth = 0;
+
+   /* Miscellaneous */
+   ctx->NewState = NEW_ALL;
+   ctx->RenderMode = GL_RENDER;
+   ctx->StippleCounter = 0;
+   ctx->NeedNormals = GL_FALSE;
+   ctx->DoViewportMapping = GL_TRUE;
+
+   ctx->NeedEyeCoords = GL_FALSE;
+   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;
+
+   /* For debug/development only */
+   ctx->NoRaster = getenv("MESA_NO_RASTER") ? GL_TRUE : GL_FALSE;
+   ctx->FirstTimeCurrent = GL_TRUE;
+
+   /* Dither disable */
+   ctx->NoDither = getenv("MESA_NO_DITHER") ? GL_TRUE : GL_FALSE;
+   if (ctx->NoDither) {
+      if (getenv("MESA_DEBUG")) {
+         fprintf(stderr, "MESA_NO_DITHER set - dithering disabled\n");
       }
-      FREE(buffer);
+      ctx->Color.DitherFlag = GL_FALSE;
    }
 }
 
@@ -1240,38 +1269,19 @@ static GLboolean alloc_proxy_textures( GLcontext *ctx )
 
 
 /*
- * Allocate and initialize a GLcontext structure.
- * Input:  visual - a GLvisual pointer
- *         sharelist - another context to share display lists with or NULL
- *         driver_ctx - pointer to device driver's context state struct
- * Return:  pointer to a new gl_context struct or NULL if error.
+ * Initialize a GLcontext struct.
  */
-GLcontext *gl_create_context( GLvisual *visual,
-                              GLcontext *share_list,
-                              void *driver_ctx,
-                              GLboolean direct )
+GLboolean gl_initialize_context_data( GLcontext *ctx,
+                                      GLvisual *visual,
+                                      GLcontext *share_list,
+                                      void *driver_ctx,
+                                      GLboolean direct )
 {
-   GLcontext *ctx;
-   GLuint i;
-
    (void) direct;  /* not used */
 
-   /* do some implementation tests */
-   assert( sizeof(GLbyte) == 1 );
-   assert( sizeof(GLshort) >= 2 );
-   assert( sizeof(GLint) >= 4 );
-   assert( sizeof(GLubyte) == 1 );
-   assert( sizeof(GLushort) >= 2 );
-   assert( sizeof(GLuint) >= 4 );
-
    /* misc one-time initializations */
    one_time_init();
 
-   ctx = (GLcontext *) CALLOC( sizeof(GLcontext) );
-   if (!ctx) {
-      return NULL;
-   }
-
    ctx->DriverCtx = driver_ctx;
    ctx->Visual = visual;
    ctx->DrawBuffer = NULL;
@@ -1280,7 +1290,7 @@ GLcontext *gl_create_context( GLvisual *visual,
    ctx->VB = gl_vb_create_for_immediate( ctx );
    if (!ctx->VB) {
       FREE( ctx );
-      return NULL;
+      return GL_FALSE;
    }
    ctx->input = ctx->VB->IM;
 
@@ -1288,7 +1298,7 @@ GLcontext *gl_create_context( GLvisual *visual,
    if (!ctx->PB) {
       FREE( ctx->VB );
       FREE( ctx );
-      return NULL;
+      return GL_FALSE;
    }
 
    if (share_list) {
@@ -1302,31 +1312,16 @@ GLcontext *gl_create_context( GLvisual *visual,
          FREE(ctx->VB);
          FREE(ctx->PB);
          FREE(ctx);
-         return NULL;
+         return GL_FALSE;
       }
    }
    ctx->Shared->RefCount++;
 
-   initialize_context( ctx );
+   init_attrib_groups( ctx );
+
    gl_reset_vb( ctx->VB );
    gl_reset_input( ctx );
 
-
-   ctx->ShineTabList = MALLOC_STRUCT( gl_shine_tab );
-   make_empty_list( ctx->ShineTabList );
-
-   for (i = 0 ; i < 10 ; i++) {
-      struct gl_shine_tab *s = MALLOC_STRUCT( gl_shine_tab );
-      s->shininess = -1;
-      s->refcount = 0;
-      insert_at_tail( ctx->ShineTabList, s );
-   }
-
-   for (i = 0 ; i < 4 ; i++) {
-      ctx->ShineTable[i] = ctx->ShineTabList->prev;
-      ctx->ShineTable[i]->refcount++;
-   }
-
    if (visual->DBflag) {
       ctx->Color.DrawBuffer = GL_BACK;
       ctx->Color.DriverDrawBuffer = GL_BACK_LEFT;
@@ -1342,7 +1337,6 @@ GLcontext *gl_create_context( GLvisual *visual,
       ctx->Pixel.DriverReadBuffer = GL_FRONT_LEFT;
    }
 
-   
 #ifdef PROFILE
    init_timings( ctx );
 #endif
@@ -1352,7 +1346,7 @@ GLcontext *gl_create_context( GLvisual *visual,
       FREE(ctx->VB);
       FREE(ctx->PB);
       FREE(ctx);
-      return NULL;
+      return GL_FALSE;
    }
 
    /* setup API dispatch tables */
@@ -1360,112 +1354,150 @@ GLcontext *gl_create_context( GLvisual *visual,
    _mesa_init_dlist_table( &ctx->Save );
    ctx->CurrentDispatch = &ctx->Exec;
 
-   return ctx;
+   return GL_TRUE;
 }
 
 
 
 /*
- * Destroy a gl_context structure.
+ * Allocate and initialize a GLcontext structure.
+ * Input:  visual - a GLvisual pointer
+ *         sharelist - another context to share display lists with or NULL
+ *         driver_ctx - pointer to device driver's context state struct
+ * Return:  pointer to a new gl_context struct or NULL if error.
  */
-void gl_destroy_context( GLcontext *ctx )
+GLcontext *gl_create_context( GLvisual *visual,
+                              GLcontext *share_list,
+                              void *driver_ctx,
+                              GLboolean direct )
 {
-   if (ctx) {
+   GLcontext *ctx = (GLcontext *) CALLOC( sizeof(GLcontext) );
+   if (!ctx) {
+      return NULL;
+   }
 
-      GLuint i;
-      struct gl_shine_tab *s, *tmps;
+   if (gl_initialize_context_data(ctx, visual, share_list,
+                                  driver_ctx, direct)) {
+      return ctx;
+   }
+   else {
+      FREE(ctx);
+      return NULL;
+   }
+}
 
-      /* 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++) {
-        gl_matrix_dtr( &ctx->ModelViewStack[i] );
-      }
-      gl_matrix_dtr( &ctx->ProjectionMatrix );
-      for (i = 0 ; i < MAX_PROJECTION_STACK_DEPTH ; i++) {
-        gl_matrix_dtr( &ctx->ProjectionStack[i] );
-      }
+/*
+ * Free the data associated with the given context.
+ * But don't free() the GLcontext struct itself!
+ */
+void gl_free_context_data( GLcontext *ctx )
+{
+   GLuint i;
+   struct gl_shine_tab *s, *tmps;
 
-      FREE( ctx->PB );
+   /* if we're destroying the current context, unbind it first */
+   if (ctx == gl_get_current_context()) {
+      gl_make_current(NULL, NULL);
+   }
 
-      if(ctx->input != ctx->VB->IM)
-         gl_immediate_free( ctx->input );
+#ifdef PROFILE
+   if (getenv("MESA_PROFILE")) {
+      print_timings( ctx );
+   }
+#endif
 
-      gl_vb_free( ctx->VB );
+   gl_matrix_dtr( &ctx->ModelView );
+   for (i = 0 ; i < MAX_MODELVIEW_STACK_DEPTH ; i++) {
+      gl_matrix_dtr( &ctx->ModelViewStack[i] );
+   }
+   gl_matrix_dtr( &ctx->ProjectionMatrix );
+   for (i = 0 ; i < MAX_PROJECTION_STACK_DEPTH ; i++) {
+      gl_matrix_dtr( &ctx->ProjectionStack[i] );
+   }
+
+   FREE( ctx->PB );
+
+   if(ctx->input != ctx->VB->IM)
+      gl_immediate_free( ctx->input );
+
+   gl_vb_free( ctx->VB );
+
+   ctx->Shared->RefCount--;
+   assert(ctx->Shared->RefCount>=0);
+   if (ctx->Shared->RefCount==0) {
+      /* free shared state */
+      free_shared_state( ctx, ctx->Shared );
+   }
+
+   foreach_s( s, tmps, ctx->ShineTabList ) {
+      FREE( s );
+   }
+   FREE( ctx->ShineTabList );
+
+   /* Free proxy texture objects */
+   gl_free_texture_object( NULL, ctx->Texture.Proxy1D );
+   gl_free_texture_object( NULL, ctx->Texture.Proxy2D );
+   gl_free_texture_object( NULL, ctx->Texture.Proxy3D );
+
+   /* Free evaluator data */
+   if (ctx->EvalMap.Map1Vertex3.Points)
+      FREE( ctx->EvalMap.Map1Vertex3.Points );
+   if (ctx->EvalMap.Map1Vertex4.Points)
+      FREE( ctx->EvalMap.Map1Vertex4.Points );
+   if (ctx->EvalMap.Map1Index.Points)
+      FREE( ctx->EvalMap.Map1Index.Points );
+   if (ctx->EvalMap.Map1Color4.Points)
+      FREE( ctx->EvalMap.Map1Color4.Points );
+   if (ctx->EvalMap.Map1Normal.Points)
+      FREE( ctx->EvalMap.Map1Normal.Points );
+   if (ctx->EvalMap.Map1Texture1.Points)
+      FREE( ctx->EvalMap.Map1Texture1.Points );
+   if (ctx->EvalMap.Map1Texture2.Points)
+      FREE( ctx->EvalMap.Map1Texture2.Points );
+   if (ctx->EvalMap.Map1Texture3.Points)
+      FREE( ctx->EvalMap.Map1Texture3.Points );
+   if (ctx->EvalMap.Map1Texture4.Points)
+      FREE( ctx->EvalMap.Map1Texture4.Points );
+
+   if (ctx->EvalMap.Map2Vertex3.Points)
+      FREE( ctx->EvalMap.Map2Vertex3.Points );
+   if (ctx->EvalMap.Map2Vertex4.Points)
+      FREE( ctx->EvalMap.Map2Vertex4.Points );
+   if (ctx->EvalMap.Map2Index.Points)
+      FREE( ctx->EvalMap.Map2Index.Points );
+   if (ctx->EvalMap.Map2Color4.Points)
+      FREE( ctx->EvalMap.Map2Color4.Points );
+   if (ctx->EvalMap.Map2Normal.Points)
+      FREE( ctx->EvalMap.Map2Normal.Points );
+   if (ctx->EvalMap.Map2Texture1.Points)
+      FREE( ctx->EvalMap.Map2Texture1.Points );
+   if (ctx->EvalMap.Map2Texture2.Points)
+      FREE( ctx->EvalMap.Map2Texture2.Points );
+   if (ctx->EvalMap.Map2Texture3.Points)
+      FREE( ctx->EvalMap.Map2Texture3.Points );
+   if (ctx->EvalMap.Map2Texture4.Points)
+      FREE( ctx->EvalMap.Map2Texture4.Points );
+
+   /* Free cache of immediate buffers. */
+   while (ctx->nr_im_queued-- > 0) {
+      struct immediate * next = ctx->freed_im_queue->next;
+      FREE( ctx->freed_im_queue );
+      ctx->freed_im_queue = next;
+   }
+   gl_extensions_dtr(ctx);
+}
 
-      ctx->Shared->RefCount--;
-      assert(ctx->Shared->RefCount>=0);
-      if (ctx->Shared->RefCount==0) {
-        /* free shared state */
-        free_shared_state( ctx, ctx->Shared );
-      }
 
-      foreach_s( s, tmps, ctx->ShineTabList ) {
-        FREE( s );
-      }
-      FREE( ctx->ShineTabList );
-
-      /* Free proxy texture objects */
-      gl_free_texture_object( NULL, ctx->Texture.Proxy1D );
-      gl_free_texture_object( NULL, ctx->Texture.Proxy2D );
-      gl_free_texture_object( NULL, ctx->Texture.Proxy3D );
-
-      /* Free evaluator data */
-      if (ctx->EvalMap.Map1Vertex3.Points)
-         FREE( ctx->EvalMap.Map1Vertex3.Points );
-      if (ctx->EvalMap.Map1Vertex4.Points)
-         FREE( ctx->EvalMap.Map1Vertex4.Points );
-      if (ctx->EvalMap.Map1Index.Points)
-         FREE( ctx->EvalMap.Map1Index.Points );
-      if (ctx->EvalMap.Map1Color4.Points)
-         FREE( ctx->EvalMap.Map1Color4.Points );
-      if (ctx->EvalMap.Map1Normal.Points)
-         FREE( ctx->EvalMap.Map1Normal.Points );
-      if (ctx->EvalMap.Map1Texture1.Points)
-         FREE( ctx->EvalMap.Map1Texture1.Points );
-      if (ctx->EvalMap.Map1Texture2.Points)
-         FREE( ctx->EvalMap.Map1Texture2.Points );
-      if (ctx->EvalMap.Map1Texture3.Points)
-         FREE( ctx->EvalMap.Map1Texture3.Points );
-      if (ctx->EvalMap.Map1Texture4.Points)
-         FREE( ctx->EvalMap.Map1Texture4.Points );
-
-      if (ctx->EvalMap.Map2Vertex3.Points)
-         FREE( ctx->EvalMap.Map2Vertex3.Points );
-      if (ctx->EvalMap.Map2Vertex4.Points)
-         FREE( ctx->EvalMap.Map2Vertex4.Points );
-      if (ctx->EvalMap.Map2Index.Points)
-         FREE( ctx->EvalMap.Map2Index.Points );
-      if (ctx->EvalMap.Map2Color4.Points)
-         FREE( ctx->EvalMap.Map2Color4.Points );
-      if (ctx->EvalMap.Map2Normal.Points)
-         FREE( ctx->EvalMap.Map2Normal.Points );
-      if (ctx->EvalMap.Map2Texture1.Points)
-         FREE( ctx->EvalMap.Map2Texture1.Points );
-      if (ctx->EvalMap.Map2Texture2.Points)
-         FREE( ctx->EvalMap.Map2Texture2.Points );
-      if (ctx->EvalMap.Map2Texture3.Points)
-         FREE( ctx->EvalMap.Map2Texture3.Points );
-      if (ctx->EvalMap.Map2Texture4.Points)
-         FREE( ctx->EvalMap.Map2Texture4.Points );
-
-      /* Free cache of immediate buffers. */
-      while (ctx->nr_im_queued-- > 0) {
-         struct immediate * next = ctx->freed_im_queue->next;
-         FREE( ctx->freed_im_queue );
-         ctx->freed_im_queue = next;
-      }
-      gl_extensions_dtr(ctx);
 
+/*
+ * Destroy a GLcontext structure.
+ */
+void gl_destroy_context( GLcontext *ctx )
+{
+   if (ctx) {
+      gl_free_context_data(ctx);
       FREE( (void *) ctx );
    }
 }
@@ -1473,7 +1505,8 @@ void gl_destroy_context( GLcontext *ctx )
 
 
 /*
- * Just reads the config files...
+ * 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 )
 {
index c31f524fccde62d75b83196fc6953106dd21f75a..237b3184408c0a43f65b1b27cb92a340fef18c75 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: context.h,v 1.9 2000/01/05 04:36:17 brianp Exp $ */
+/* $Id: context.h,v 1.10 2000/01/14 04:45:47 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -97,11 +97,17 @@ extern GLcontext *gl_create_context( GLvisual *visual,
                                      void *driver_ctx,
                                      GLboolean direct);
 
+extern GLboolean gl_initialize_context_data( GLcontext *ctx,
+                                             GLvisual *visual,
+                                             GLcontext *share_list,
+                                             void *driver_ctx,
+                                             GLboolean direct );
+
+extern void gl_free_context_data( GLcontext *ctx );
+
 extern 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.
- */
+
 extern void gl_context_initialize( GLcontext *ctx );