Mesa 4.1 release notes

                               October 29, 2002

                                PLEASE READ!!!!



Introduction
------------

Mesa uses an even/odd version number scheme like the Linux kernel.
Even numbered versions (such as 4.0) designate stable releases.
Odd numbered versions (such as 4.1) designate new developmental releases.


New Features in Mesa 4.1
------------------------

New extensions.  Docs at http://oss.sgi.com/projects/ogl-sample/registry/

GL_NV_vertex_program

    NVIDIA's vertex programming extension

GL_NV_vertex_program1_1

    A few features built on top of GL_NV_vertex_program

GL_ARB_window_pos

    This is the ARB-approved version of GL_MESA_window_pos

GL_ARB_depth_texture

    This is the ARB-approved version of GL_SGIX_depth_texture.
    It allows depth (Z buffer) data to be stored in textures.
    This is used by GL_ARB_shadow

GL_ARB_shadow

    Shadow mapping with depth textures.
    This is the ARB-approved version of GL_SGIX_shadow.

GL_ARB_shadow_ambient

    Allows one to specify the luminance of shadowed pixels.
    This is the ARB-approved version of GL_SGIX_shadow_ambient.

GL_EXT_shadow_funcs

    Extends the set of GL_ARB_shadow texture comparision functions to
    include all eight of standard OpenGL dept-test functions.

GL_ARB_point_parameters

    This is basically the same as GL_EXT_point_parameters.

GL_ARB_texture_env_crossbar

    Allows any texture combine stage to reference any texture source unit.

GL_NV_point_sprite

    For rendering points as textured quads.  Useful for particle effects.

GL_NV_texture_rectangle  (new in 4.0.4 actually)

    Allows one to use textures with sizes that are not powers of two.
    Note that mipmapping and several texture wrap modes are not allowed.

GL_EXT_multi_draw_arrays

    Allows arrays of vertex arrays to be rendered with one call.

GL_EXT_stencil_two_side

   Separate stencil modes for front and back-facing polygons.

GLX_SGIX_fbconfig & GLX_SGIX_pbuffer

   Off-screen rendering support.

GL_ATI_texture_mirror_once

   Adds two new texture wrap modes: GL_MIRROR_CLAMP_ATI and
   GL_MIRROR_CLAMP_TO_EDGE_ATI.



Device Driver Status
--------------------

A number of Mesa's software drivers haven't been actively maintained for
some time.  We rely on volunteers to maintain many of these drivers.
Here's the current status of all included drivers:


Driver			Status
----------------------	---------------------
XMesa (Xlib)		implements OpenGL 1.3
OSMesa (off-screen)	implements OpenGL 1.3
FX (3dfx Voodoo1/2)	implements OpenGL 1.3
SVGA			implements OpenGL 1.3
Wind River UGL		implements OpenGL 1.3
Windows/Win32		implements OpenGL 1.3
DOS/DJGPP		implements OpenGL 1.3
GGI			implements OpenGL 1.3
BeOS			needs updating (underway)
Allegro			needs updating
D3D			needs updating
DOS			needs updating



New features in GLUT
--------------------

1. Frames per second printing

   GLUT now looks for an environment variable called "GLUT_FPS".  If it's
   set, GLUT will print out a frames/second statistic to stderr when
   glutSwapBuffers() is called.  By default, frames/second is computed
   and displayed once every 5 seconds.  You can specify a different
   interval (in milliseconds) when you set the env var.  For example
   'export GLUT_FPS=1000' or 'setenv GLUT_FPS 1000' will set the interval
   to one second.

   NOTE: the demo or application must call the glutInit() function for
   this to work.  Otherwise, the env var will be ignored.

   Finally, this feature may not be reliable in multi-window programs.


2. glutGetProcAddress() function

   The new function:

        void *glutGetProcAddress(const char *procName)

   is a wrapper for glXGetProcAddressARB() and wglGetProcAddress().  It
   lets you dynamically get the address of an OpenGL function at runtime.
   The GLUT_API_VERSION has been bumped to 5, but I haven't bumped the
   GLUT version number from 3.7 since that's probably Mark Kilgard's role.

   This function should probably also be able to return the address of
   GLUT functions themselves, but it doesn't do that yet.



XXX Things To Do Yet XXXX
-------------------------

isosurf with vertex program exhibits some missing triangles (probably
when recycling the vertex buffer for long prims).



Porting Info
------------

If you're porting a DRI or other driver from Mesa 4.0.x to Mesa 4.1 here
are some things to change:

1. ctx->Texture._ReallyEnabled is obsolete.

   Since there are now 5 texture targets (1D, 2D, 3D, cube and rect) that
   left room for only 6 units (6*5 < 32) in this field.
   This field is being replaced by ctx->Texture._EnabledUnits which has one
   bit per texture unit.  If the bit k of _EnabledUnits is set, that means
   ctx->Texture.Unit[k]._ReallyEnabled is non-zero.  You'll have to look at
   ctx->Texture.Unit[k]._ReallyEnabled to learn if the 1D, 2D, 3D, cube or
   rect texture is enabled for unit k.

   This also means that the constants TEXTURE1_*, TEXTURE2_*, etc are
   obsolete.

   The tokens TEXTURE0_* have been replaced as well (since there's no
   significance to the "0" part:

   old token           new token
   TEXTURE0_1D         TEXTURE_1D_BIT
   TEXTURE0_2D         TEXTURE_2D_BIT
   TEXTURE0_3D         TEXTURE_3D_BIT
   TEXTURE0_CUBE       TEXTURE_CUBE_BIT
   <none>              TEXTURE_RECT_BIT

   These tokens are only used for the ctx->Texture.Unit[i].Enabled and
   ctx->Texture.Unit[i]._ReallyEnabled fields.  Exactly 0 or 1 bits will
   be set in _ReallyEnabled at any time!

   Q: "What's the purpose of Unit[i].Enabled vs Unit[i]._ReallyEnabled?"
   A: The user can enable GL_TEXTURE_1D, GL_TEXTURE_2D, etc for any
      texure unit all at once (an unusual thing to do).
      OpenGL defines priorities that basically say GL_TEXTURE_2D has
      higher priority than GL_TEXTURE_1D, etc.  Also, just because a
      texture target is enabled by the user doesn't mean we'll actually
      use that texture!  If a texture object is incomplete (missing mip-
      map levels, etc) it's as if texturing is disabled for that target.
      The _ReallyEnabled field will have a bit set ONLY if the texture
      target is enabled and complete.  This spares the driver writer from
      examining a _lot_ of GL state to determine which texture target is
      to be used.


2. Tnl tokens changes

   During the implementation of GL_NV_vertex_program some of the vertex
   buffer code was changed.  Specifically, the VERT_* bits defined in
   tnl/t_context.h have been renamed to better match the conventions of
   GL_NV_vertex_program.  The old names are still present but obsolete.
   Drivers should use the newer names.

   For example:  VERT_RGBA is now VERT_BIT_COLOR0 and
   VERT_SPEC_RGB is now VERT_BIT_COLOR1.



3. Read/Draw Buffer changes

   The business of setting the current read/draw buffers in Mesa 4.0.x
   was complicated.  It's much simpler now in Mesa 4.1.

   Here are the changes:

   - Renamed ctx->Color.DrawDestMask to ctx->Color._DrawDestMask
   - Removed ctx->Color.DriverDrawBuffer
   - Removed ctx->Pixel.DriverReadBuffer
   - Removed ctx->Color.MultiDrawBuffer
   - Removed ctx->Driver.SetDrawBuffer()
   - Removed swrast->Driver.SetReadBuffer().
   - Added ctx->Color._DrawDestMask - a bitmask of FRONT/BACK_LEFT/RIGHT_BIT
     values to indicate the current draw buffers.
   - Added ctx->Pixel._ReadSrcMask to indicate the source for pixel reading.
     The value is _one_ of the FRONT/BACK_LEFT/RIGHT_BIT values.
   - Added ctx->Driver.DrawBuffer() and ctx->Driver.ReadBuffer().
     These functions exactly correspond to glDrawBuffer and glReadBuffer calls.
     Many drivers will set ctx->Driver.DrawBuffer = _swrast_DrawBuffer and
     leave ctx->Draw.ReadBuffer NULL.
     DRI drivers should implement their own function for ctx->Driver.DrawBuffer
     and use it to set the current hardware drawing buffer.  You'll probably
     also want to check for GL_FRONT_AND_BACK mode and fall back to software.
     Call _swrast_DrawBuffer() too, to update the swrast state.
   - Added swrast->Driver.SetBuffer().
     This function should be implemented by all device drivers that use swrast.
     Mesa will call it to specify the buffer to use for span reading AND
     writing and point/line/triangle rendering.
     There should be no confusion between current read or draw buffer anymore.
   - Added swrast->CurrentBuffer to indicate which color buffer to read/draw.
     Will be FRONT_LEFT_BIT, BACK_LEFT_BIT, FRONT_RIGHT_BIT or BACK_RIGHT_BIT.
     This value is usually passed to swrast->Driver.SetBuffer().


4. _mesa_create_context() changes.  This function now takes a pointer to
   a __GLimports object.  The __GLimports structure contains function
   pointers to system functions like fprintf(), malloc(), etc.
   The _mesa_init_default_imports() function can be used to initialize
   a __GLimports object.  Most device drivers (like the DRI drivers)
   should use this.


5. In tnl's struct vertex_buffer, the field "ProjectedClipCoords"
   has been replaced by "NdcPtr" to better match the OpenGL spec's
   terminology.


6. Since GL_EXT_stencil_two_side has been implemented, many of the
   ctx->Stencil fields are now 2-element arrays.  For example,
   "GLenum Ref" is now "GLenum Ref[2]"  The [0] elements are the front-face
   values and the [1] elements are the back-face values.
   ctx->Stencil.ActiveFace is 0 or 1 to indicate the current face for
   the glStencilOp/Func/Mask() functions.
   ctx->Stencil.TestTwoSide controls whether or not 1 or 2-sided stenciling
   is enabled.


7. Removed ctx->Polygon._OffsetAny.  Removed ctx->Polygon.OffsetMRD.


8. GLfloat / GLchan changes:

   - Changed ctx->Driver.ClearColor() to take GLfloat[4] instead of GLchan[4].
     ctx->Color.ClearColor is now GLfloat[4] too.
   - Changed ctx->Driver.AlphaRef() to take GLfloat instead of GLchan.
   - ctx->Color.AlphaRef is now GLfloat.
   - texObj->BorderColor is now GLfloat[4].  texObj->_BorderChan is GLchan[4].

   This is part of an effort to remove all GLchan types from core Mesa so
   that someday we can support 8, 16 and 32-bit color channels dynamically
   at runtime, instead of at compile-time.


9. GLboolean ctx->Tranform.ClipEnabled[MAX_CLIP_PLANES] has been replaced
   by GLuint ctx->Transform.ClipPlanesEnabled.  The later is a bitfield.


10. There's a new matrix_stack type in mtypes.h used for the Modelview,
   Projection, Color and Texcoord matrix stacks.


11. The ctx->Current.* fields have changed a lot.  Now, there's a
   ctx->Current.Attrib[] array for all vertex attributes which matches
   the NV vertex program conventions.


----------------------------------------------------------------------