
                         Mesa 3.3 release notes

                             July 21, 2000

                             PLEASE READ!!!!



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

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

Mesa 3.3 has a undergone many internal changes since version 3.2
and features a lot of new extensions.  3.3 is expected to be pretty
stable, but perhaps not as stable as 3.2 which has been used by
thousands of users over the past months.

Everyone is encouraged to try Mesa 3.3.  Bugs should be reported to
the Mesa bug database on www.sourceforge.net.



Header file / GLenum changes
----------------------------

The gl.h and glu.h headers now use #defines to define all GL_* tokens
instead of C-language enums.  This change improves Mesa/OpenGL
interoperability.



New API dispatch code
---------------------

The core Mesa gl* functions are now implemented with a new dispatch
(jump table) which will allow simultaneous direct/indirect rendering.

The code is found in the glapi*.[ch] files.

Of interest:  the actual "glFooBar" functions are generated with
templatized code defined in glapitemp.h and included by glapi.c
The glapitemp.h template should be reusable for all sorts of OpenGL
projects.

The new dispatch code has also optimized with x86 assembly code.
This optimization eliminates copying the function arguments during
dispatch.



New thread support
------------------

Thread support in Mesa has been rewritten.  The glthread.[ch] files
replace mthreads.[ch].  Thread safety is always enabled (on platforms
which support threads, that is).  There is virtually no performance
penalty for typical single-thread applications.  See the glapi.c
file for details.

The Xlib driver (XMesa) is now thread-safe as well.  Be sure to
call XInitThreads() in your app first.  See the xdemos/glthreads.c
demo for an example.



Make configuration changes
--------------------------

If you use the old-style (non GNU automake) method to build Mesa note
that several of the configuration names have changed:

   Old name        New name
   -------------   ----------------
   linux-elf       linux
   linux           linux-static
   linux-386-elf   linux-386
   linux-386       linux-386-static
   etc.



New extensions
--------------

GL_ARB_transpose_matrix
	Adds glLoadTransposeMatrixARB() and glMultTransposeMatrixARB()
        functions.

GL_ARB_texture_cube_map
	For cube-based reflection mapping.

GL_EXT_texture_add_env
	Adds GL_ADD texture environment mode.
	See http://www.berkelium.com/OpenGL/EXT/texture_env_add.txt

GL_EXT_texture_lod_bias
	Allows mipmapped texture blurring and sharpening.

GLX_EXT_visual_rating extension
	This extension has no effect in stand-alone Mesa (used for DRI).

GL_HP_occlusion_test
	Used for bounding box occlusion testing (see demos/occlude.c).

GL_SGIX_pixel_texture / GL_SGIS_pixel_texture
	Lets glDraw/CopyPixels draw a texture coordinate image.

GL_SGI_color_matrix
	Adds a color matrix and another set of scale and bias parameters
	to the glDraw/CopyPixels paths.

GL_SGI_color_table
	Adds additional color tables to the glDraw/Read/CopyPixels paths.

GL_EXT_histogram
	Compute histograms for glDraw/Read/CopyPixels.

GL_EXT_blend_func_separate
	This is the same as GL_INGR_blend_func_separate.

GL_ARB_texture_cube_mapping
	6-face cube mapping, nicer than sphere mapping

GL_EXT_texture_env_combine
	For advanced texture environment effects.


Documentation for all these functions can be found at
http://oss.sgi.com/projects/ogl-sample/registry/



GLX_SGI_make_current_read functionality
---------------------------------------

The functionality of this extension is needed for GLX 1.3 (and required
for the Linux/OpenGL standards base).

Implementing this function required a **DEVICE DRIVER CHANGE**.
The old SetBuffer() function has been replaced by SetReadBuffer() and
SetDrawBuffer().  All device drivers will have to be updated because
of this change.

The new function, glXMakeContextCurrent(), in GLX 1.3 now works in Mesa.
The xdemos/wincopy.c program demonstrates it.



Image-related code changes
--------------------------

The imaging path code used by glDrawPixels, glTexImage[123]D,
glTexSubImage[123], etc has been rewritten.  It's now faster,
uses less memory and has several bug fixes.  This work was
actually started in Mesa 3.1 with the glTexImage paths but has now
been carried over to glDrawPixels as well.



Device driver interface changes
-------------------------------

Added new functions for hardware stencil buffer support:
   WriteStencilSpan
   ReadStencilSpan
   WriteStencilPixels
   ReadStencilPixels


Removed old depth buffer functions:
   AllocDepthBuffer
   DepthTestSpan
   DepthTestPixels
   ReadDepthSpanFloat
   ReadDepthSpanInt


Added new depth buffer functions:
   WriteDepthSpan
   ReadDepthSpan
   WriteDepthPixels
   ReadDepthPixels

   These functions always read/write 32-bit GLuints.  This will allow
   drivers to have anywhere from 0 to 32-bit Z buffers without
   recompiling for 16 vs 32 bits as was previously needed.


New texture image functions
   The entire interface for texture image specification has been updated.
   With the new functions, it's optional for Mesa to keep an internal copy
   of all textures.  Texture download should be a lot faster when the extra
   copy isn't made.

Misc changes
   TexEnv now takes a target argument
   Removed UseGlobalTexturePalette (use Enable function instead)


Also added
   ReadPixels
   CopyPixels


The SetBufffer function has been replaced by SetDrawBuffer and
SetReadBuffer functions.  This lets core Mesa independently
specify which buffer is to be used for reading and which for
drawing.

The Clear function's mask parameter has changed.  Instead of
mask being the flags specified by the user to glClear, the
mask is now a bitmask of the DD_*_BIT flags in dd.h.  Now
multiple color buffers can be specified for clearing (ala
glDrawBuffers).  The driver's Clear function must also
check the glColorMask glIndexMask, and glStencilMask settings
and do the right thing.  See the X/Mesa, OS/Mesa, or FX/Mesa
drivers for examples.


The depth buffer changes shouldn't be hard to make for existing
drivers.  In fact, it should simply the code.  Be careful with
the depthBits value passed to gl_create_context().  1 is a bad
value!  It should normally be 0, 16, 24, or 32.


gl_create_framebuffer() takes new arguments which explicitly tell
core Mesa which ancillary buffers (depth, stencil, accum, alpha)
should be implemented in software.  Mesa hardware drivers should
carefully set these flags depending on which buffers are in the
graphics card.



Internal constants
------------------

Point and line size range and granularity limits are now stored
in the gl_constants struct, which is the Const member of GLcontext.
The limits are initialized from values in config.h but may be
overridden by device drivers to reflect the limits of that driver's
hardware.

Also added constants for NumAuxBuffers and SubPixelBits.



OpenGL Conformance
------------------

Mesa now passes all the OpenGL 1.1 conformance tests, except for
antialiased lines.  AA lines fail on some, but not all, the tests.
In order to fix the remaining failures, a new AA line algorithm will
be needed (which computes coverage values for end-point fragments).
This will be done for Mesa 3.5/3.6.



OpenGL 1.2 GL_ARB_imaging subset
--------------------------------

Mesa 3.3 implements all the features of GL_ARB_imaging except for
image convolution.  This will (hopefully) be done for Mesa 3.5/3.6.



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