first big check-in of new Mesa 3.3 code
diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c
index 628e734..cf8bb8b 100644
--- a/src/mesa/main/context.c
+++ b/src/mesa/main/context.c
@@ -1,8 +1,8 @@
-/* $Id: context.c,v 1.18 1999/11/08 07:36:43 brianp Exp $ */
+/* $Id: context.c,v 1.19 1999/11/11 01:22:25 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
- * Version:  3.1
+ * Version:  3.3
  *
  * Copyright (C) 1999  Brian Paul   All Rights Reserved.
  *
@@ -25,8 +25,6 @@
  */
 
 
-/* $XFree86: xc/lib/GL/mesa/src/context.c,v 1.4 1999/04/04 00:20:21 dawes Exp $ */
-
 /*
  * If multi-threading is enabled (-DTHREADS) then each thread has it's
  * own rendering context.  A thread obtains the pointer to its GLcontext
@@ -36,42 +34,34 @@
  */
 
 
-
 #ifdef PC_HEADER
 #include "all.h"
 #else
-#ifndef XFree86Server
-#include <assert.h>
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#else
-#include "GL/xf86glx.h"
-#endif
+#include "glheader.h"
 #include "accum.h"
 #include "alphabuf.h"
-#include "api.h"
 #include "clip.h"
 #include "context.h"
 #include "cva.h"
 #include "depth.h"
+#include "dispatch.h"
 #include "dlist.h"
 #include "eval.h"
 #include "enums.h"
 #include "extensions.h"
 #include "fog.h"
+#include "glapi.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 "pointers.h"
 #include "quads.h"
 #include "shade.h"
 #include "simple_list.h"
@@ -95,40 +85,6 @@
 #endif
 
 
-/*
- * Memory allocation functions.  Called via the MALLOC, CALLOC and
- * FREE macros when DEBUG symbol is defined.
- * You might want to set breakpoints on these functions or plug in
- * other memory allocation functions.  The Mesa sources should only
- * use the MALLOC and FREE macros (which could also be overriden).
- *
- * XXX these functions should probably go into a new glmemory.c file.
- */
-
-/*
- * Allocate memory (uninitialized)
- */
-void *gl_malloc(size_t bytes)
-{
-   return malloc(bytes);
-}
-
-/*
- * Allocate memory and initialize to zero.
- */
-void *gl_calloc(size_t bytes)
-{
-   return calloc(1, bytes);
-}
-
-/*
- * Free memory
- */
-void gl_free(void *ptr)
-{
-   free(ptr);
-}
-
 
 /**********************************************************************/
 /*****                  Context and Thread management             *****/
@@ -157,7 +113,7 @@
 #else
 
 /* One Current Context pointer for all threads in the address space */
-GLcontext *CC = NULL;
+GLcontext *_mesa_current_context = NULL;
 struct immediate *CURRENT_INPUT = NULL;
 
 #endif /*THREADS*/
@@ -578,7 +534,6 @@
       for (i=0;i<n;i++)
          map->Points[i] = initial[i];
    }
-   map->Retain = GL_FALSE;
 }
 
 
@@ -597,10 +552,20 @@
       for (i=0;i<n;i++)
          map->Points[i] = initial[i];
    }
-   map->Retain = GL_FALSE;
 }
 
 
+static void init_palette( struct gl_palette *p )
+{
+   p->Table[0] = 255;
+   p->Table[1] = 255;
+   p->Table[2] = 255;
+   p->Table[3] = 255;
+   p->Size = 1;
+   p->IntFormat = GL_RGBA;
+   p->Format = GL_RGBA;
+}
+
 
 /*
  * Initialize a gl_context structure to default values.
@@ -929,14 +894,7 @@
       for (i=0; i<MAX_TEXTURE_UNITS; i++)
          init_texture_unit( ctx, i );
 
-      ctx->Texture.SharedPalette = GL_FALSE;
-      ctx->Texture.Palette[0] = 255;
-      ctx->Texture.Palette[1] = 255;
-      ctx->Texture.Palette[2] = 255;
-      ctx->Texture.Palette[3] = 255;
-      ctx->Texture.PaletteSize = 1;
-      ctx->Texture.PaletteIntFormat = GL_RGBA;
-      ctx->Texture.PaletteFormat = GL_RGBA;
+      init_palette(&ctx->Texture.Palette);
 
       /* Transformation group */
       ctx->Transform.MatrixMode = GL_MODELVIEW;
@@ -1331,13 +1289,10 @@
    ctx->Driver.ReadDepthSpanFloat = gl_read_depth_span_float;
    ctx->Driver.ReadDepthSpanInt = gl_read_depth_span_int;
 
-   
-
 #ifdef PROFILE
    init_timings( ctx );
 #endif
 
-#ifdef GL_VERSION_1_1
    if (!alloc_proxy_textures(ctx)) {
       free_shared_state(ctx, ctx->Shared);
       FREE(ctx->VB);
@@ -1345,10 +1300,11 @@
       FREE(ctx);
       return NULL;
    }
-#endif
 
-   gl_init_api_function_pointers( ctx );
-   ctx->API = ctx->Exec;   /* GL_EXECUTE is default */
+   /* setup API dispatch tables */
+   _mesa_init_exec_table( &ctx->Exec );
+   _mesa_init_dlist_table( &ctx->Save );
+   ctx->CurrentDispatch = &ctx->Exec;
 
    return ctx;
 }
@@ -1462,8 +1418,8 @@
       FREE( (void *) ctx );
 
 #ifndef THREADS
-      if (ctx==CC) {
-         CC = NULL;
+      if (ctx == _mesa_current_context) {
+         _mesa_current_context = NULL;
 	 CURRENT_INPUT = NULL;
       }
 #endif
@@ -1532,37 +1488,42 @@
 /*
  * Set the current context, binding the given frame buffer to the context.
  */
-void gl_make_current( GLcontext *ctx, GLframebuffer *buffer )
+void gl_make_current( GLcontext *newCtx, GLframebuffer *buffer )
 {
-   GET_CONTEXT;
+   GET_CURRENT_CONTEXT(oldCtx);
 
    /* Flush the old context
     */
-   if (CC) {
-      ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(CC, "gl_make_current");
+   if (oldCtx) {
+      ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(oldCtx, "gl_make_current");
    }
 
 #ifdef THREADS
    /* TODO: unbind old buffer from context? */
-   set_thread_context( ctx );
+   set_thread_context( newCtx );
 #else
-   if (CC && CC->Buffer) {
+   if (oldCtx && oldCtx->Buffer) {
       /* unbind frame buffer from context */
-      CC->Buffer = NULL;
+      oldCtx->Buffer = NULL;
    }
-   CC = ctx;
-   if (ctx) {
-      SET_IMMEDIATE(ctx, ctx->input);
+   _mesa_current_context = newCtx;
+   if (newCtx) {
+      SET_IMMEDIATE(newCtx, newCtx->input);
    }
 #endif
 
+   if (newCtx)
+      _glapi_set_dispatch(newCtx->CurrentDispatch);
+   else
+      _glapi_set_dispatch(NULL);  /* none current */
+
    if (MESA_VERBOSE) fprintf(stderr, "gl_make_current()\n");
 
-   if (ctx && buffer) {
-      /* TODO: check if ctx and buffer's visual match??? */
-      ctx->Buffer = buffer;      /* Bind the frame buffer to the context */
-      ctx->NewState = NEW_ALL;   /* just to be safe */
-      gl_update_state( ctx );
+   if (newCtx && buffer) {
+      /* TODO: check if newCtx and buffer's visual match??? */
+      newCtx->Buffer = buffer;      /* Bind the frame buffer to the context */
+      newCtx->NewState = NEW_ALL;   /* just to be safe */
+      gl_update_state( newCtx );
    }
 }
 
@@ -1575,7 +1536,7 @@
 #ifdef THREADS
    return gl_get_thread_context();
 #else
-   return CC;
+   return _mesa_current_context;
 #endif
 }
 
@@ -1659,25 +1620,72 @@
 }
 
 
-
 /*
- * Someday a GLS library or OpenGL-like debugger may call this function
- * to register it's own set of API entry points.
- * Input: ctx - the context to set API pointers for
- *        api - if NULL, restore original API pointers
- *              else, set API function table to this table.
+ * This should be called by device drivers just before they do a
+ * swapbuffers.  Any pending rendering commands will be executed.
  */
-void gl_set_api_table( GLcontext *ctx, const struct gl_api_table *api )
+void
+_mesa_swapbuffers(GLcontext *ctx)
 {
-   if (api) {
-      MEMCPY( &ctx->API, api, sizeof(struct gl_api_table) );
-   }
-   else {
-      MEMCPY( &ctx->API, &ctx->Exec, sizeof(struct gl_api_table) );
-   }
+   FLUSH_VB( ctx, "swap buffers" );
 }
 
 
+/*
+ * Return pointer to this context's current API dispatch table.
+ * It'll either be the immediate-mode execute dispatcher or the
+ * display list compile dispatcher.
+ */
+struct _glapi_table *
+_mesa_get_dispatch(GLcontext *ctx)
+{
+   return ctx->CurrentDispatch;
+}
+
+
+
+void
+_mesa_ResizeBuffersMESA( void )
+{
+   GET_CURRENT_CONTEXT(ctx);
+
+   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->Buffer->Width == (GLint) buf_width &&
+       ctx->Buffer->Height == (GLint) buf_height)
+      return;
+
+   ctx->NewState |= NEW_RASTER_OPS;  /* to update scissor / window bounds */
+
+   /* save buffer size */
+   ctx->Buffer->Width = buf_width;
+   ctx->Buffer->Height = buf_height;
+
+   /* Reallocate other buffers if needed. */
+   if (ctx->Visual->DepthBits>0) {
+      /* reallocate depth buffer */
+      (*ctx->Driver.AllocDepthBuffer)( ctx );
+   }
+   if (ctx->Visual->StencilBits>0) {
+      /* reallocate stencil buffer */
+      gl_alloc_stencil_buffer( ctx );
+   }
+   if (ctx->Visual->AccumBits>0) {
+      /* reallocate accum buffer */
+      gl_alloc_accum_buffer( ctx );
+   }
+   if (ctx->Visual->SoftwareAlpha) {
+      gl_alloc_alpha_buffers( ctx );
+   }
+}
+
 
 
 /**********************************************************************/
@@ -1801,66 +1809,6 @@
 
 
 
-/*
- * Execute a glGetError command
- */
-GLenum gl_GetError( GLcontext *ctx )
-{
-   GLenum e = ctx->ErrorValue;
-
-   ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL( ctx, "glGetError", (GLenum) 0);
-
-   if (MESA_VERBOSE & VERBOSE_API)
-      fprintf(stderr, "glGetError <-- %s\n", gl_lookup_enum_by_nr(e));
-
-   ctx->ErrorValue = (GLenum) GL_NO_ERROR;
-   return e;
-}
-
-
-
-void gl_ResizeBuffersMESA( GLcontext *ctx )
-{
-   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->Buffer->Width == (GLint) buf_width &&
-       ctx->Buffer->Height == (GLint) buf_height)
-      return;
-
-   ctx->NewState |= NEW_RASTER_OPS;  /* to update scissor / window bounds */
-
-   /* save buffer size */
-   ctx->Buffer->Width = buf_width;
-   ctx->Buffer->Height = buf_height;
-
-   /* Reallocate other buffers if needed. */
-   if (ctx->Visual->DepthBits>0) {
-      /* reallocate depth buffer */
-      (*ctx->Driver.AllocDepthBuffer)( ctx );
-   }
-   if (ctx->Visual->StencilBits>0) {
-      /* reallocate stencil buffer */
-      gl_alloc_stencil_buffer( ctx );
-   }
-   if (ctx->Visual->AccumBits>0) {
-      /* reallocate accum buffer */
-      gl_alloc_accum_buffer( ctx );
-   }
-   if (ctx->Visual->SoftwareAlpha) {
-      gl_alloc_alpha_buffers( ctx );
-   }
-}
-
-
-
-
 /**********************************************************************/
 /*****                   State update logic                       *****/
 /**********************************************************************/