
                            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.


----------------------------------------------------------------------
$Id: RELNOTES-4.1,v 1.1.1.1 2012/03/29 17:22:08 uid42307 Exp $
