mesa: added ctx->Driver.ValidateFramebuffer() callback
[mesa.git] / src / mesa / main / dd.h
index c6760d4ed9053914a5b8dca130791119b7a50c56..989791f39f19baa59bcf408e95cad3279cc1b09a 100644 (file)
@@ -5,9 +5,9 @@
 
 /*
  * Mesa 3-D graphics library
- * Version:  4.1
+ * Version:  6.5.2
  *
- * Copyright (C) 1999-2002  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
 /* THIS FILE ONLY INCLUDED BY mtypes.h !!!!! */
 
 struct gl_pixelstore_attrib;
-
-/* Mask bits sent to the driver Clear() function */
-#define DD_FRONT_LEFT_BIT  FRONT_LEFT_BIT         /* 1 */
-#define DD_FRONT_RIGHT_BIT FRONT_RIGHT_BIT        /* 2 */
-#define DD_BACK_LEFT_BIT   BACK_LEFT_BIT          /* 4 */
-#define DD_BACK_RIGHT_BIT  BACK_RIGHT_BIT         /* 8 */
-#define DD_AUX0            AUX0_BIT               /* future use */
-#define DD_AUX1            AUX1_BIT               /* future use */
-#define DD_AUX2            AUX2_BIT               /* future use */
-#define DD_AUX3            AUX3_BIT               /* future use */
-#define DD_DEPTH_BIT       GL_DEPTH_BUFFER_BIT    /* 0x00000100 */
-#define DD_ACCUM_BIT       GL_ACCUM_BUFFER_BIT    /* 0x00000200 */
-#define DD_STENCIL_BIT     GL_STENCIL_BUFFER_BIT  /* 0x00000400 */
-
+struct mesa_display_list;
 
 /**
  * Device driver function table.
@@ -58,12 +45,14 @@ struct gl_pixelstore_attrib;
  *
  * Vertex transformation/clipping/lighting is patched into the T&L module.
  * Rasterization functions are patched into the swrast module.
+ *
+ * Note: when new functions are added here, the drivers/common/driverfuncs.c
+ * file should be updated too!!!
  */
 struct dd_function_table {
    /**
     * Return a string as needed by glGetString().
-    *
-    * Only the GL_RENDERER token must be implemented.  Otherwise, NULL can be
+    * Only the GL_RENDERER query must be implemented.  Otherwise, NULL can be
     * returned.
     */
    const GLubyte * (*GetString)( GLcontext *ctx, GLenum name );
@@ -74,53 +63,29 @@ struct dd_function_table {
     * This is in addition to any state change callbacks Mesa may already have
     * made.
     */
-   void (*UpdateState)( GLcontext *ctx, GLuint new_state );
-
-   /**
-    * Clear the color/depth/stencil/accum buffer(s).
-    *
-    * \param mask a bitmask of the DD_*_BIT values defined above that indicates
-    * which buffers need to be cleared.
-    * \param all if true then clear the whole buffer, else clear only the
-    * region defined by <tt>(x, y, width, height)</tt>.
-    * 
-    * This function must obey the glColorMask(), glIndexMask() and glStencilMask()
-    * settings!
-    * Software Mesa can do masked clears if the device driver can't.
-    */
-   void (*Clear)( GLcontext *ctx, GLbitfield mask, GLboolean all,
-                 GLint x, GLint y, GLint width, GLint height );
-
-   /**
-    * Specify the current buffer for writing.  
-    *
-    * Called via glDrawBuffer().  Note the driver must organize fallbacks (e.g.
-    * with swrast) if it cannot implement the requested mode.
-    */
-   void (*DrawBuffer)( GLcontext *ctx, GLenum buffer );
-
-   /**
-    * Specifies the current buffer for reading.  
-    *
-    * Called via glReadBuffer().
-    */
-   void (*ReadBuffer)( GLcontext *ctx, GLenum buffer );
+   void (*UpdateState)( GLcontext *ctx, GLbitfield new_state );
 
    /**
     * Get the width and height of the named buffer/window.
     *
     * Mesa uses this to determine when the driver's window size has changed.
+    * XXX OBSOLETE: this function will be removed in the future.
     */
    void (*GetBufferSize)( GLframebuffer *buffer,
                           GLuint *width, GLuint *height );
 
    /**
-    * Resize the driver's depth/stencil/accum/back buffers to match the
-    * size given in the GLframebuffer struct.  
-    *
-    * This is typically called when Mesa detects that a window size has changed.
+    * Resize the given framebuffer to the given size.
+    * XXX OBSOLETE: this function will be removed in the future.
     */
-   void (*ResizeBuffers)( GLframebuffer *buffer );
+   void (*ResizeBuffers)( GLcontext *ctx, GLframebuffer *fb,
+                          GLuint width, GLuint height);
+
+   /**
+    * Called whenever an error is generated.  
+    * __GLcontextRec::ErrorValue contains the error value.
+    */
+   void (*Error)( GLcontext *ctx );
 
    /**
     * This is called whenever glFinish() is called.
@@ -133,33 +98,30 @@ struct dd_function_table {
    void (*Flush)( GLcontext *ctx );
 
    /**
-    * Called whenever an error is generated.  
-    *
-    * __GLcontextRec::ErrorValue contains the error value.
+    * Clear the color/depth/stencil/accum buffer(s).
+    * \param buffers  a bitmask of BUFFER_BIT_* flags indicating which
+    *                 renderbuffers need to be cleared.
     */
-   void (*Error)( GLcontext *ctx );
-
+   void (*Clear)( GLcontext *ctx, GLbitfield buffers );
 
    /**
-    * \name For hardware accumulation buffer
+    * Execute glAccum command.
     */
-   /*@{*/
+   void (*Accum)( GLcontext *ctx, GLenum op, GLfloat value );
+
+
    /**
-    * Execute glAccum command within the given scissor region.
+    * Execute glRasterPos, updating the ctx->Current.Raster fields
     */
-   void (*Accum)( GLcontext *ctx, GLenum op, GLfloat value,
-                 GLint xpos, GLint ypos, GLint width, GLint height );
-   /*@}*/
-
+   void (*RasterPos)( GLcontext *ctx, const GLfloat v[4] );
 
    /**
-    * \name glDraw(), glRead(), glCopyPixels() and glBitmap() functions
+    * \name Image-related functions
     */
    /*@{*/
 
    /**
-    * This is called by glDrawPixels().
-    *
+    * Called by glDrawPixels().
     * \p unpack describes how to unpack the source image data.
     */
    void (*DrawPixels)( GLcontext *ctx,
@@ -178,20 +140,14 @@ struct dd_function_table {
                       GLvoid *dest );
 
    /**
-    * Do a glCopyPixels().  
-    *
-    * This function must respect all rasterization state, glPixelTransfer(),
-    * glPixelZoom(), etc.
+    * Called by glCopyPixels().  
     */
-   void (*CopyPixels)( GLcontext *ctx,
-                            GLint srcx, GLint srcy,
-                            GLsizei width, GLsizei height,
-                            GLint dstx, GLint dsty, GLenum type );
+   void (*CopyPixels)( GLcontext *ctx, GLint srcx, GLint srcy,
+                       GLsizei width, GLsizei height,
+                       GLint dstx, GLint dsty, GLenum type );
 
    /**
-    * This is called by glBitmap().  
-    *
-    * Works the same as dd_function_table::DrawPixels, above.
+    * Called by glBitmap().  
     */
    void (*Bitmap)( GLcontext *ctx,
                   GLint x, GLint y, GLsizei width, GLsizei height,
@@ -212,9 +168,8 @@ struct dd_function_table {
     * functions.  The driver should examine \p internalFormat and return a
     * pointer to an appropriate gl_texture_format.
     */
-   const struct gl_texture_format *
-   (*ChooseTextureFormat)( GLcontext *ctx, GLint internalFormat,
-                           GLenum srcFormat, GLenum srcType );
+   const struct gl_texture_format *(*ChooseTextureFormat)( GLcontext *ctx,
+                      GLint internalFormat, GLenum srcFormat, GLenum srcType );
 
    /**
     * Called by glTexImage1D().
@@ -324,6 +279,14 @@ struct dd_function_table {
                           struct gl_texture_object *texObj,
                           struct gl_texture_image *texImage );
 
+   /**
+    * Called by glGetTexImage().
+    */
+   void (*GetTexImage)( GLcontext *ctx, GLenum target, GLint level,
+                        GLenum format, GLenum type, GLvoid *pixels,
+                        struct gl_texture_object *texObj,
+                        struct gl_texture_image *texImage );
+
    /**
     * Called by glCopyTexImage1D().
     * 
@@ -369,6 +332,12 @@ struct dd_function_table {
                               GLint x, GLint y,
                               GLsizei width, GLsizei height );
 
+   /**
+    * Called by glGenerateMipmap() or when GL_GENERATE_MIPMAP_SGIS is enabled.
+    */
+   void (*GenerateMipmap)(GLcontext *ctx, GLenum target,
+                          struct gl_texture_object *texObj);
+
    /**
     * Called by glTexImage[123]D when user specifies a proxy texture
     * target.  
@@ -480,6 +449,23 @@ struct dd_function_table {
                                    GLsizei imageSize, const GLvoid *data,
                                    struct gl_texture_object *texObj,
                                    struct gl_texture_image *texImage);
+
+
+   /**
+    * Called by glGetCompressedTexImage.
+    */
+   void (*GetCompressedTexImage)(GLcontext *ctx, GLenum target, GLint level,
+                                 GLvoid *img,
+                                 struct gl_texture_object *texObj,
+                                 struct gl_texture_image *texImage);
+
+   /**
+    * Called to query number of bytes of storage needed to store the
+    * specified compressed texture.
+    */
+   GLuint (*CompressedTextureSize)( GLcontext *ctx, GLsizei width,
+                                    GLsizei height, GLsizei depth,
+                                    GLenum format );
    /*@}*/
 
    /**
@@ -493,24 +479,18 @@ struct dd_function_table {
    void (*BindTexture)( GLcontext *ctx, GLenum target,
                         struct gl_texture_object *tObj );
 
-   /**
-    * Called when a texture object is created.
-    */
-   void (*CreateTexture)( GLcontext *ctx, struct gl_texture_object *tObj );
-
    /**
     * Called to allocate a new texture object.
-    * 
-    * \note This function pointer should be initialized by drivers \e before
-    * calling _mesa_initialize_context() since context initialization involves
-    * allocating some texture objects!
+    * A new gl_texture_object should be returned.  The driver should
+    * attach to it any device-specific info it needs.
     */
    struct gl_texture_object * (*NewTextureObject)( GLcontext *ctx, GLuint name,
                                                    GLenum target );
    /**
     * Called when a texture object is about to be deallocated.  
     *
-    * Driver should free anything attached to the DriverData pointers.
+    * Driver should delete the gl_texture_object object and anything
+    * hanging off of it.
     */
    void (*DeleteTexture)( GLcontext *ctx, struct gl_texture_object *tObj );
 
@@ -519,6 +499,29 @@ struct dd_function_table {
     */
    struct gl_texture_image * (*NewTextureImage)( GLcontext *ctx );
 
+   /** 
+    * Called to free tImage->Data.
+    */
+   void (*FreeTexImageData)( GLcontext *ctx, struct gl_texture_image *tImage );
+
+   /** Map texture image data into user space */
+   void (*MapTexture)( GLcontext *ctx, struct gl_texture_object *tObj );
+   /** Unmap texture images from user space */
+   void (*UnmapTexture)( GLcontext *ctx, struct gl_texture_object *tObj );
+
+   /**
+    * Note: no context argument.  This function doesn't initially look
+    * like it belongs here, except that the driver is the only entity
+    * that knows for sure how the texture memory is allocated - via
+    * the above callbacks.  There is then an argument that the driver
+    * knows what memcpy paths might be fast.  Typically this is invoked with
+    * 
+    * to -- a pointer into texture memory allocated by NewTextureImage() above.
+    * from -- a pointer into client memory or a mesa temporary.
+    * sz -- nr bytes to copy.
+    */
+   void* (*TextureMemCpy)( void *to, const void *from, size_t sz );
+
    /**
     * Called by glAreTextureResident().
     */
@@ -570,6 +573,30 @@ struct dd_function_table {
    /*@}*/
 
 
+   /**
+    * \name Vertex/fragment program functions
+    */
+   /*@{*/
+   /** Bind a vertex/fragment program */
+   void (*BindProgram)(GLcontext *ctx, GLenum target, struct gl_program *prog);
+   /** Allocate a new program */
+   struct gl_program * (*NewProgram)(GLcontext *ctx, GLenum target, GLuint id);
+   /** Delete a program */
+   void (*DeleteProgram)(GLcontext *ctx, struct gl_program *prog);   
+   /** Notify driver that a program string has been specified. */
+   void (*ProgramStringNotify)(GLcontext *ctx, GLenum target, 
+                              struct gl_program *prog);
+   /** Get value of a program register during program execution. */
+   void (*GetProgramRegister)(GLcontext *ctx, enum register_file file,
+                              GLuint index, GLfloat val[4]);
+
+   /** Query if program can be loaded onto hardware */
+   GLboolean (*IsProgramNative)(GLcontext *ctx, GLenum target, 
+                               struct gl_program *prog);
+   
+   /*@}*/
+
+
    /**
     * \name State-changing functions.
     *
@@ -585,9 +612,8 @@ struct dd_function_table {
    /** Set the blend color */
    void (*BlendColor)(GLcontext *ctx, const GLfloat color[4]);
    /** Set the blend equation */
-   void (*BlendEquation)(GLcontext *ctx, GLenum mode);
+   void (*BlendEquationSeparate)(GLcontext *ctx, GLenum modeRGB, GLenum modeA);
    /** Specify pixel arithmetic */
-   void (*BlendFunc)(GLcontext *ctx, GLenum sfactor, GLenum dfactor);
    void (*BlendFuncSeparate)(GLcontext *ctx,
                              GLenum sfactorRGB, GLenum dfactorRGB,
                              GLenum sfactorA, GLenum dfactorA);
@@ -614,8 +640,12 @@ struct dd_function_table {
    void (*DepthFunc)(GLcontext *ctx, GLenum func);
    /** Enable or disable writing into the depth buffer */
    void (*DepthMask)(GLcontext *ctx, GLboolean flag);
-   /** Specify mapping of depth values from normalized device coordinates to window coordinates */
+   /** Specify mapping of depth values from NDC to window coordinates */
    void (*DepthRange)(GLcontext *ctx, GLclampd nearval, GLclampd farval);
+   /** Specify the current buffer for writing */
+   void (*DrawBuffer)( GLcontext *ctx, GLenum buffer );
+   /** Specify the buffers for writing for fragment programs*/
+   void (*DrawBuffers)( GLcontext *ctx, GLsizei n, const GLenum *buffers );
    /** Enable or disable server-side gl capabilities */
    void (*Enable)(GLcontext *ctx, GLenum cap, GLboolean state);
    /** Specify fog parameters */
@@ -624,7 +654,10 @@ struct dd_function_table {
    void (*Hint)(GLcontext *ctx, GLenum target, GLenum mode);
    /** Control the writing of individual bits in the color index buffers */
    void (*IndexMask)(GLcontext *ctx, GLuint mask);
-   /** Set light source parameters */
+   /** Set light source parameters.
+    * Note: for GL_POSITION and GL_SPOT_DIRECTION, params will have already
+    * been transformed to eye-space.
+    */
    void (*Lightfv)(GLcontext *ctx, GLenum light,
                   GLenum pname, const GLfloat *params );
    /** Set the lighting model parameters */
@@ -645,19 +678,22 @@ struct dd_function_table {
    void (*PolygonOffset)(GLcontext *ctx, GLfloat factor, GLfloat units);
    /** Set the polygon stippling pattern */
    void (*PolygonStipple)(GLcontext *ctx, const GLubyte *mask );
+   /* Specifies the current buffer for reading */
+   void (*ReadBuffer)( GLcontext *ctx, GLenum buffer );
    /** Set rasterization mode */
    void (*RenderMode)(GLcontext *ctx, GLenum mode );
    /** Define the scissor box */
    void (*Scissor)(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h);
    /** Select flat or smooth shading */
    void (*ShadeModel)(GLcontext *ctx, GLenum mode);
-   /** Set function and reference value for stencil testing */
-   void (*StencilFunc)(GLcontext *ctx, GLenum func, GLint ref, GLuint mask);
-   /** Control the writing of individual bits in the stencil planes */
-   void (*StencilMask)(GLcontext *ctx, GLuint mask);
-   /** Set stencil test actions */
-   void (*StencilOp)(GLcontext *ctx, GLenum fail, GLenum zfail, GLenum zpass);
-   void (*ActiveStencilFace)(GLcontext *ctx, GLuint face);
+   /** OpenGL 2.0 two-sided StencilFunc */
+   void (*StencilFuncSeparate)(GLcontext *ctx, GLenum face, GLenum func,
+                               GLint ref, GLuint mask);
+   /** OpenGL 2.0 two-sided StencilMask */
+   void (*StencilMaskSeparate)(GLcontext *ctx, GLenum face, GLuint mask);
+   /** OpenGL 2.0 two-sided StencilOp */
+   void (*StencilOpSeparate)(GLcontext *ctx, GLenum face, GLenum fail,
+                             GLenum zfail, GLenum zpass);
    /** Control the generation of texture coordinates */
    void (*TexGen)(GLcontext *ctx, GLenum coord, GLenum pname,
                  const GLfloat *params);
@@ -697,6 +733,8 @@ struct dd_function_table {
    void (*EdgeFlagPointer)(GLcontext *ctx, GLsizei stride, const GLvoid *ptr);
    void (*VertexAttribPointer)(GLcontext *ctx, GLuint index, GLint size,
                                GLenum type, GLsizei stride, const GLvoid *ptr);
+   void (*LockArraysEXT)( GLcontext *ctx, GLint first, GLsizei count );
+   void (*UnlockArraysEXT)( GLcontext *ctx );
    /*@}*/
 
 
@@ -720,7 +758,7 @@ struct dd_function_table {
    
 
    /**
-    * \name Vertex buffer object functions
+    * \name Vertex/pixel buffer object functions
     */
 #if FEATURE_ARB_vertex_buffer_object
    /*@{*/
@@ -752,6 +790,112 @@ struct dd_function_table {
    /*@}*/
 #endif
 
+   /**
+    * \name Functions for GL_EXT_framebuffer_object
+    */
+#if FEATURE_EXT_framebuffer_object
+   /*@{*/
+   struct gl_framebuffer * (*NewFramebuffer)(GLcontext *ctx, GLuint name);
+   struct gl_renderbuffer * (*NewRenderbuffer)(GLcontext *ctx, GLuint name);
+   void (*BindFramebuffer)(GLcontext *ctx, GLenum target,
+                           struct gl_framebuffer *fb, struct gl_framebuffer *fbread);
+   void (*FramebufferRenderbuffer)(GLcontext *ctx, 
+                                   struct gl_framebuffer *fb,
+                                   GLenum attachment,
+                                   struct gl_renderbuffer *rb);
+   void (*RenderTexture)(GLcontext *ctx,
+                         struct gl_framebuffer *fb,
+                         struct gl_renderbuffer_attachment *att);
+   void (*FinishRenderTexture)(GLcontext *ctx,
+                               struct gl_renderbuffer_attachment *att);
+   void (*ValidateFramebuffer)(GLcontext *ctx,
+                               struct gl_framebuffer *fb);
+   /*@}*/
+#endif
+#if FEATURE_EXT_framebuffer_blit
+   void (*BlitFramebuffer)(GLcontext *ctx,
+                           GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
+                           GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
+                           GLbitfield mask, GLenum filter);
+#endif
+
+   /**
+    * \name Query objects
+    */
+   /*@{*/
+   struct gl_query_object * (*NewQueryObject)(GLcontext *ctx, GLuint id);
+   void (*DeleteQuery)(GLcontext *ctx, struct gl_query_object *q);
+   void (*BeginQuery)(GLcontext *ctx, struct gl_query_object *q);
+   void (*EndQuery)(GLcontext *ctx, struct gl_query_object *q);
+   void (*CheckQuery)(GLcontext *ctx, struct gl_query_object *q);
+   void (*WaitQuery)(GLcontext *ctx, struct gl_query_object *q);
+   /*@}*/
+
+
+   /**
+    * \name Vertex Array objects
+    */
+   /*@{*/
+   struct gl_array_object * (*NewArrayObject)(GLcontext *ctx, GLuint id);
+   void (*DeleteArrayObject)(GLcontext *ctx, struct gl_array_object *obj);
+   void (*BindArrayObject)(GLcontext *ctx, struct gl_array_object *obj);
+   /*@}*/
+
+   /**
+    * \name GLSL-related functions (ARB extensions and OpenGL 2.x)
+    */
+   /*@{*/
+   void (*AttachShader)(GLcontext *ctx, GLuint program, GLuint shader);
+   void (*BindAttribLocation)(GLcontext *ctx, GLuint program, GLuint index,
+                              const GLcharARB *name);
+   void (*CompileShader)(GLcontext *ctx, GLuint shader);
+   GLuint (*CreateShader)(GLcontext *ctx, GLenum type);
+   GLuint (*CreateProgram)(GLcontext *ctx);
+   void (*DeleteProgram2)(GLcontext *ctx, GLuint program);
+   void (*DeleteShader)(GLcontext *ctx, GLuint shader);
+   void (*DetachShader)(GLcontext *ctx, GLuint program, GLuint shader);
+   void (*GetActiveAttrib)(GLcontext *ctx, GLuint program, GLuint index,
+                           GLsizei maxLength, GLsizei * length, GLint * size,
+                           GLenum * type, GLcharARB * name);
+   void (*GetActiveUniform)(GLcontext *ctx, GLuint program, GLuint index,
+                            GLsizei maxLength, GLsizei *length, GLint *size,
+                            GLenum *type, GLcharARB *name);
+   void (*GetAttachedShaders)(GLcontext *ctx, GLuint program, GLsizei maxCount,
+                              GLsizei *count, GLuint *obj);
+   GLint (*GetAttribLocation)(GLcontext *ctx, GLuint program,
+                              const GLcharARB *name);
+   GLuint (*GetHandle)(GLcontext *ctx, GLenum pname);
+   void (*GetProgramiv)(GLcontext *ctx, GLuint program,
+                        GLenum pname, GLint *params);
+   void (*GetProgramInfoLog)(GLcontext *ctx, GLuint program, GLsizei bufSize,
+                             GLsizei *length, GLchar *infoLog);
+   void (*GetShaderiv)(GLcontext *ctx, GLuint shader,
+                       GLenum pname, GLint *params);
+   void (*GetShaderInfoLog)(GLcontext *ctx, GLuint shader, GLsizei bufSize,
+                            GLsizei *length, GLchar *infoLog);
+   void (*GetShaderSource)(GLcontext *ctx, GLuint shader, GLsizei maxLength,
+                           GLsizei *length, GLcharARB *sourceOut);
+   void (*GetUniformfv)(GLcontext *ctx, GLuint program, GLint location,
+                        GLfloat *params);
+   void (*GetUniformiv)(GLcontext *ctx, GLuint program, GLint location,
+                        GLint *params);
+   GLint (*GetUniformLocation)(GLcontext *ctx, GLuint program,
+                               const GLcharARB *name);
+   GLboolean (*IsProgram)(GLcontext *ctx, GLuint name);
+   GLboolean (*IsShader)(GLcontext *ctx, GLuint name);
+   void (*LinkProgram)(GLcontext *ctx, GLuint program);
+   void (*ShaderSource)(GLcontext *ctx, GLuint shader, const GLchar *source);
+   void (*Uniform)(GLcontext *ctx, GLint location, GLsizei count,
+                   const GLvoid *values, GLenum type);
+   void (*UniformMatrix)(GLcontext *ctx, GLint cols, GLint rows,
+                         GLenum matrixType, GLint location, GLsizei count,
+                         GLboolean transpose, const GLfloat *values);
+   void (*UseProgram)(GLcontext *ctx, GLuint program);
+   void (*ValidateProgram)(GLcontext *ctx, GLuint program);
+   /* XXX many more to come */
+   /*@}*/
+
+
    /**
     * \name Support for multiple T&L engines
     */
@@ -777,9 +921,9 @@ struct dd_function_table {
    void (*ValidateTnlModule)( GLcontext *ctx, GLuint new_state );
 
 
-#define PRIM_OUTSIDE_BEGIN_END   GL_POLYGON+1
-#define PRIM_INSIDE_UNKNOWN_PRIM GL_POLYGON+2
-#define PRIM_UNKNOWN             GL_POLYGON+3
+#define PRIM_OUTSIDE_BEGIN_END   (GL_POLYGON+1)
+#define PRIM_INSIDE_UNKNOWN_PRIM (GL_POLYGON+2)
+#define PRIM_UNKNOWN             (GL_POLYGON+3)
 
    /**
     * Set by the driver-supplied T&L engine.  
@@ -808,6 +952,7 @@ struct dd_function_table {
     * these conditions.
     */
    GLuint NeedFlush;
+   GLuint SaveNeedFlush;
 
    /**
     * If inside glBegin()/glEnd(), it should ASSERT(0).  Otherwise, if
@@ -819,6 +964,14 @@ struct dd_function_table {
     * FLUSH_UPDATE_CURRENT bit, even after performing the update.
     */
    void (*FlushVertices)( GLcontext *ctx, GLuint flags );
+   void (*SaveFlushVertices)( GLcontext *ctx );
+
+   /**
+    * Give the driver the opportunity to hook in its own vtxfmt for
+    * compiling optimized display lists.  This is called on each valid
+    * glBegin() during list compilation.
+    */
+   GLboolean (*NotifySaveBegin)( GLcontext *ctx, GLenum mode );
 
    /**
     * Notify driver that the special derived value _NeedEyeCoords has
@@ -841,12 +994,12 @@ struct dd_function_table {
    void (*EndList)( GLcontext *ctx );
 
    /**
-    * Called by glCallList(s), but not recursively.
+    * Called by glCallList(s).
     *
     * Notify the T&L component before and after calling a display list.
-    * Called by glCallList(s), but not recursively.
     */
-   void (*BeginCallList)( GLcontext *ctx, GLuint list );
+   void (*BeginCallList)( GLcontext *ctx, 
+                         struct mesa_display_list *dlist );
    /**
     * Called by glEndCallList().
     *
@@ -854,22 +1007,6 @@ struct dd_function_table {
     */
    void (*EndCallList)( GLcontext *ctx );
 
-   /**
-    * Let the T&L component know when the context becomes current.
-    */
-   void (*MakeCurrent)( GLcontext *ctx, GLframebuffer *drawBuffer,
-                       GLframebuffer *readBuffer );
-
-   /**
-    * Called by glLockArraysEXT().
-    */
-   void (*LockArraysEXT)( GLcontext *ctx, GLint first, GLsizei count );
-   /**
-    * Called by UnlockArraysEXT().
-    */
-   void (*UnlockArraysEXT)( GLcontext *ctx );
-   /*@}*/
-
 };
 
 
@@ -896,79 +1033,86 @@ typedef struct {
     * \name Vertex
     */
    /*@{*/
-   void (*ArrayElement)( GLint ); /* NOTE */
-   void (*Color3f)( GLfloat, GLfloat, GLfloat );
-   void (*Color3fv)( const GLfloat * );
-   void (*Color3ub)( GLubyte, GLubyte, GLubyte );
-   void (*Color3ubv)( const GLubyte * );
-   void (*Color4f)( GLfloat, GLfloat, GLfloat, GLfloat );
-   void (*Color4fv)( const GLfloat * );
-   void (*Color4ub)( GLubyte, GLubyte, GLubyte, GLubyte );
-   void (*Color4ubv)( const GLubyte * );
-   void (*EdgeFlag)( GLboolean );
-   void (*EdgeFlagv)( const GLboolean * );
-   void (*EvalCoord1f)( GLfloat );          /* NOTE */
-   void (*EvalCoord1fv)( const GLfloat * ); /* NOTE */
-   void (*EvalCoord2f)( GLfloat, GLfloat ); /* NOTE */
-   void (*EvalCoord2fv)( const GLfloat * ); /* NOTE */
-   void (*EvalPoint1)( GLint );             /* NOTE */
-   void (*EvalPoint2)( GLint, GLint );      /* NOTE */
-   void (*FogCoordfEXT)( GLfloat );
-   void (*FogCoordfvEXT)( const GLfloat * );
-   void (*Indexi)( GLint );
-   void (*Indexiv)( const GLint * );
-   void (*Materialfv)( GLenum face, GLenum pname, const GLfloat * ); /* NOTE */
-   void (*MultiTexCoord1fARB)( GLenum, GLfloat );
-   void (*MultiTexCoord1fvARB)( GLenum, const GLfloat * );
-   void (*MultiTexCoord2fARB)( GLenum, GLfloat, GLfloat );
-   void (*MultiTexCoord2fvARB)( GLenum, const GLfloat * );
-   void (*MultiTexCoord3fARB)( GLenum, GLfloat, GLfloat, GLfloat );
-   void (*MultiTexCoord3fvARB)( GLenum, const GLfloat * );
-   void (*MultiTexCoord4fARB)( GLenum, GLfloat, GLfloat, GLfloat, GLfloat );
-   void (*MultiTexCoord4fvARB)( GLenum, const GLfloat * );
-   void (*Normal3f)( GLfloat, GLfloat, GLfloat );
-   void (*Normal3fv)( const GLfloat * );
-   void (*SecondaryColor3fEXT)( GLfloat, GLfloat, GLfloat );
-   void (*SecondaryColor3fvEXT)( const GLfloat * );
-   void (*SecondaryColor3ubEXT)( GLubyte, GLubyte, GLubyte );
-   void (*SecondaryColor3ubvEXT)( const GLubyte * );
-   void (*TexCoord1f)( GLfloat );
-   void (*TexCoord1fv)( const GLfloat * );
-   void (*TexCoord2f)( GLfloat, GLfloat );
-   void (*TexCoord2fv)( const GLfloat * );
-   void (*TexCoord3f)( GLfloat, GLfloat, GLfloat );
-   void (*TexCoord3fv)( const GLfloat * );
-   void (*TexCoord4f)( GLfloat, GLfloat, GLfloat, GLfloat );
-   void (*TexCoord4fv)( const GLfloat * );
-   void (*Vertex2f)( GLfloat, GLfloat );
-   void (*Vertex2fv)( const GLfloat * );
-   void (*Vertex3f)( GLfloat, GLfloat, GLfloat );
-   void (*Vertex3fv)( const GLfloat * );
-   void (*Vertex4f)( GLfloat, GLfloat, GLfloat, GLfloat );
-   void (*Vertex4fv)( const GLfloat * );
-   void (*CallList)( GLuint ); /* NOTE */
-   void (*Begin)( GLenum );
-   void (*End)( void );
-   void (*VertexAttrib4fNV)( GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w );
-   void (*VertexAttrib4fvNV)( GLuint index, const GLfloat *v );
+   void (GLAPIENTRYP ArrayElement)( GLint ); /* NOTE */
+   void (GLAPIENTRYP Color3f)( GLfloat, GLfloat, GLfloat );
+   void (GLAPIENTRYP Color3fv)( const GLfloat * );
+   void (GLAPIENTRYP Color4f)( GLfloat, GLfloat, GLfloat, GLfloat );
+   void (GLAPIENTRYP Color4fv)( const GLfloat * );
+   void (GLAPIENTRYP EdgeFlag)( GLboolean );
+   void (GLAPIENTRYP EvalCoord1f)( GLfloat );          /* NOTE */
+   void (GLAPIENTRYP EvalCoord1fv)( const GLfloat * ); /* NOTE */
+   void (GLAPIENTRYP EvalCoord2f)( GLfloat, GLfloat ); /* NOTE */
+   void (GLAPIENTRYP EvalCoord2fv)( const GLfloat * ); /* NOTE */
+   void (GLAPIENTRYP EvalPoint1)( GLint );             /* NOTE */
+   void (GLAPIENTRYP EvalPoint2)( GLint, GLint );      /* NOTE */
+   void (GLAPIENTRYP FogCoordfEXT)( GLfloat );
+   void (GLAPIENTRYP FogCoordfvEXT)( const GLfloat * );
+   void (GLAPIENTRYP Indexf)( GLfloat );
+   void (GLAPIENTRYP Indexfv)( const GLfloat * );
+   void (GLAPIENTRYP Materialfv)( GLenum face, GLenum pname, const GLfloat * ); /* NOTE */
+   void (GLAPIENTRYP MultiTexCoord1fARB)( GLenum, GLfloat );
+   void (GLAPIENTRYP MultiTexCoord1fvARB)( GLenum, const GLfloat * );
+   void (GLAPIENTRYP MultiTexCoord2fARB)( GLenum, GLfloat, GLfloat );
+   void (GLAPIENTRYP MultiTexCoord2fvARB)( GLenum, const GLfloat * );
+   void (GLAPIENTRYP MultiTexCoord3fARB)( GLenum, GLfloat, GLfloat, GLfloat );
+   void (GLAPIENTRYP MultiTexCoord3fvARB)( GLenum, const GLfloat * );
+   void (GLAPIENTRYP MultiTexCoord4fARB)( GLenum, GLfloat, GLfloat, GLfloat, GLfloat );
+   void (GLAPIENTRYP MultiTexCoord4fvARB)( GLenum, const GLfloat * );
+   void (GLAPIENTRYP Normal3f)( GLfloat, GLfloat, GLfloat );
+   void (GLAPIENTRYP Normal3fv)( const GLfloat * );
+   void (GLAPIENTRYP SecondaryColor3fEXT)( GLfloat, GLfloat, GLfloat );
+   void (GLAPIENTRYP SecondaryColor3fvEXT)( const GLfloat * );
+   void (GLAPIENTRYP TexCoord1f)( GLfloat );
+   void (GLAPIENTRYP TexCoord1fv)( const GLfloat * );
+   void (GLAPIENTRYP TexCoord2f)( GLfloat, GLfloat );
+   void (GLAPIENTRYP TexCoord2fv)( const GLfloat * );
+   void (GLAPIENTRYP TexCoord3f)( GLfloat, GLfloat, GLfloat );
+   void (GLAPIENTRYP TexCoord3fv)( const GLfloat * );
+   void (GLAPIENTRYP TexCoord4f)( GLfloat, GLfloat, GLfloat, GLfloat );
+   void (GLAPIENTRYP TexCoord4fv)( const GLfloat * );
+   void (GLAPIENTRYP Vertex2f)( GLfloat, GLfloat );
+   void (GLAPIENTRYP Vertex2fv)( const GLfloat * );
+   void (GLAPIENTRYP Vertex3f)( GLfloat, GLfloat, GLfloat );
+   void (GLAPIENTRYP Vertex3fv)( const GLfloat * );
+   void (GLAPIENTRYP Vertex4f)( GLfloat, GLfloat, GLfloat, GLfloat );
+   void (GLAPIENTRYP Vertex4fv)( const GLfloat * );
+   void (GLAPIENTRYP CallList)( GLuint );      /* NOTE */
+   void (GLAPIENTRYP CallLists)( GLsizei, GLenum, const GLvoid * );    /* NOTE */
+   void (GLAPIENTRYP Begin)( GLenum );
+   void (GLAPIENTRYP End)( void );
+   /* GL_NV_vertex_program */
+   void (GLAPIENTRYP VertexAttrib1fNV)( GLuint index, GLfloat x );
+   void (GLAPIENTRYP VertexAttrib1fvNV)( GLuint index, const GLfloat *v );
+   void (GLAPIENTRYP VertexAttrib2fNV)( GLuint index, GLfloat x, GLfloat y );
+   void (GLAPIENTRYP VertexAttrib2fvNV)( GLuint index, const GLfloat *v );
+   void (GLAPIENTRYP VertexAttrib3fNV)( GLuint index, GLfloat x, GLfloat y, GLfloat z );
+   void (GLAPIENTRYP VertexAttrib3fvNV)( GLuint index, const GLfloat *v );
+   void (GLAPIENTRYP VertexAttrib4fNV)( GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w );
+   void (GLAPIENTRYP VertexAttrib4fvNV)( GLuint index, const GLfloat *v );
+#if FEATURE_ARB_vertex_program
+   void (GLAPIENTRYP VertexAttrib1fARB)( GLuint index, GLfloat x );
+   void (GLAPIENTRYP VertexAttrib1fvARB)( GLuint index, const GLfloat *v );
+   void (GLAPIENTRYP VertexAttrib2fARB)( GLuint index, GLfloat x, GLfloat y );
+   void (GLAPIENTRYP VertexAttrib2fvARB)( GLuint index, const GLfloat *v );
+   void (GLAPIENTRYP VertexAttrib3fARB)( GLuint index, GLfloat x, GLfloat y, GLfloat z );
+   void (GLAPIENTRYP VertexAttrib3fvARB)( GLuint index, const GLfloat *v );
+   void (GLAPIENTRYP VertexAttrib4fARB)( GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w );
+   void (GLAPIENTRYP VertexAttrib4fvARB)( GLuint index, const GLfloat *v );
+#endif
    /*@}*/
 
    /*
     */
-   void (*Rectf)( GLfloat, GLfloat, GLfloat, GLfloat );
+   void (GLAPIENTRYP Rectf)( GLfloat, GLfloat, GLfloat, GLfloat );
 
    /**
     * \name Array
-    *
-    * These may or may not belong here.  Heuristic: if an array is
-    * enabled, the installed vertex format should support that array and
-    * its current size natively.
     */
    /*@{*/
-   void (*DrawArrays)( GLenum mode, GLint start, GLsizei count );
-   void (*DrawElements)( GLenum mode, GLsizei count, GLenum type,
+   void (GLAPIENTRYP DrawArrays)( GLenum mode, GLint start, GLsizei count );
+   void (GLAPIENTRYP DrawElements)( GLenum mode, GLsizei count, GLenum type,
                         const GLvoid *indices );
-   void (*DrawRangeElements)( GLenum mode, GLuint start,
+   void (GLAPIENTRYP DrawRangeElements)( GLenum mode, GLuint start,
                              GLuint end, GLsizei count,
                              GLenum type, const GLvoid *indices );
    /*@}*/
@@ -984,15 +1128,10 @@ typedef struct {
     * accelerated vertex formats, eventually...
     */
    /*@{*/
-   void (*EvalMesh1)( GLenum mode, GLint i1, GLint i2 );
-   void (*EvalMesh2)( GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 );
+   void (GLAPIENTRYP EvalMesh1)( GLenum mode, GLint i1, GLint i2 );
+   void (GLAPIENTRYP EvalMesh2)( GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 );
    /*@}*/
 
-   /**
-    * Should core try to send colors to glColor4f or glColor4chan,
-    * where it has a choice?
-    */
-   GLboolean prefer_float_colors;
 } GLvertexformat;