Mesa Version History
====================

.. note::

   Changes for Mesa 6.4 and later are documented in the corresponding
   :doc:`release notes <relnotes>` file.

1.0 beta February 1995
----------------------

-  Initial release

1.1 beta March 4, 1995
----------------------

Changes:

-  faster point and line drawing (2x faster)
-  more systems supported, better Makefiles
-  Renamed lib*.a files to avoid collisions
-  many small bug fixes

New:

-  pseudo-GLX functions added
-  new implementation of evaluators (eval2.c)
-  GLUT support

1.1.1 beta March 7, 1995
------------------------

Changes:

-  Reverted from eval2.c to eval.c due to FPE on Linux
-  more speed improvements
-  more Makefile changes

1.1.2 beta March 14, 1995
-------------------------

New:

-  implementation of SGI's blending extensions
-  glXUseXFont implemented
-  added MESA_DEBUG environment variable support

Changes:

-  Using eval2.c again
-  more FPE-prevention checks (0-length normals are OK)
-  a few small bug fixes
-  much faster pixel logic ops!
-  faster transformation arithmetic

1.1.3 beta March 31, 1995
-------------------------

New:

-  gluScaleImage() and gluBuild2DMipMaps() implemented
-  Mesa widgets for Xt/Motif
-  blendEXT demos
-  added environment variables for selecting visuals

Changes:

-  almost all GLUT demos work correctly now
-  faster X device driver functions
-  more bug fixes

1.1.4 beta April 20, 1995
-------------------------

Bug fixes:

-  missing #define SEEK_SET in src-tk/image.c
-  compile glShadeModel into display lists
-  fixed pow() domain error in src/light.c
-  fixed "flickering bitmaps" in double buffer mode
-  fixed tk.h and aux.h for C++
-  state of LIGHT_MODEL_LOCAL_VIEWER was inverted

New features:

-  MUCH, MUCH nicer dithering in 8-bit RGB mode
-  updated widgets and widget demos
-  Implemented GLXPixmap functions
-  Added GLU 1.1 and GLX 1.1 functions
-  Changed the X/Mesa interface API, more versatile
-  Implemented gluPartialDisk()

1.2 May 22, 1995
----------------

Bug fixes:

-  IRIX 4.x makefile problem
-  modified tk to share root colormap as needed
-  gluLookAt normalization problem
-  suppress Expose, NoExpose events in swapbuffers
-  glBitmap() and glDrawPixels() clipping

New features:

-  GL_BLEND, GL_MODULATE, GL_DECAL, and GL_REPLACE_EXT texture modes
   implemented
-  texture maps stored more efficiently
-  texture maps can be compiled into display lists
-  Bogdan Sikorski's GLU polygon tesselation code
-  Linas Vepstas's sweep and extrusion library
-  glXCreateContext()'s shareList parameter works as it's supposed to.
   XMesaCreateContext() updated to accept a shareList parameter too.
-  Mesa can be compiled with real OpenGL .h files
-  MESA_BACK_BUFFER environment variable
-  better GLX error checking

1.2.1 June 22, 1995
-------------------

Bug fixes:

-  X/Mesa double buffer window resize crash
-  widgets now pass PointerMotion events
-  X/Mesa incorrect default clear color and drawing color
-  more robust X MIT-SHM support in X/Mesa
-  glTexImage( format=GL_LUMINANCE ) didn't work
-  GL_LINE mode polygons with line width > 1.0 could cause a crash
-  numerous feedback bugs
-  glReadPixels() from depth buffer was wrong
-  error prone depth and stencil buffer allocation New features:
-  Preliminary Microsoft Windows driver
-  Implemented a number of missing functions: glEvalCoord[12][df]v(),
   glGet...(), etc.
-  Added a few missing symbols to gl.h and glu.h
-  Faster rendering of smooth-shaded, RGBA, depth-buffered polygons.
-  Faster rendering of lines when width=2.0
-  Stencil-related functions now work in display lists

Changes:

-  renamed aux.h as glaux.h (MS-DOS names can't start with aux)
-  most filenames are in 8.3 format to accommodate MS-DOS
-  use GLubytes to store arrays of colors instead of GLints

1.2.2 August 2, 1995
--------------------

New features:

-  texture mapped points and lines
-  NURBS! (but not 100% complete)
-  viewports may safely extend beyond window boundaries
-  MESA_PRIVATE_CMAP environment variable
-  Grayscale X display support
-  two new demos: demos/gears.c and demos/shadow.c
-  MachTen for Macintosh configuration

Bug fixes:

-  glGet*(GL_DEPTH_BITS) returned bytes, not bits
-  point, line, and bitmap rasterization suffered from roundoff errors
-  fixed a division by zero error in line clippping
-  occasional wrong default background color really fixed!
-  glDepthFunc(GL_ALWAYS) with glDepthMask(GL_FALSE) didn't work
-  gluBuild2DMipmaps malloc problem fixed
-  view volume clipping of smooth shaded lines resulted in bad colors

Changes:

-  new visual selection method in glXChooseVisual()
-  improved GLU quadric functions
-  call XSync for glFinish and XFlush for glFlush
-  glVertex() calls now use a function pointer to avoid conditionals
-  removed contrib directory from Mesa tar file (available on ftp site)
-  AIX shared library support
-  Removed GLUenum type as it's not in OpenGL

1.2.3 September 26, 1995
------------------------

New features:

-  Mesa header files now equivalent to SGI OpenGL headers
-  Support for HP's Color Recovery dithering displays
-  Faster vertex transformation
-  Faster raster operations into X windows under certain conditions
-  New configurations: HP w/ shared libs, Ultrix w/ GCC, Data General
-  4-bit visuals now supported

Bug fixes:

-  glScissor bug fixed
-  round-off errors in clipping lines against clip planes fixed
-  byte swapping between hosts and display servers implemented
-  glGetError() can be called without a current rendering context
-  problem with accidentally culled polygons is fixed
-  fixed some widget compilation problems

1.2.4 November 17, 1995
-----------------------

New features:

-  More speed improvements (lighting, fogging, polygon drawing)
-  Window system and OS-independent off-screen rendering
-  Preliminary Fortran bindings
-  glPolygonOffsetEXT implemented
-  glColorMask and glIndexMask now fully implemented
-  glPixelZoom implemented
-  display lists fully implemented
-  gamma correction
-  dithering in 8-bit TrueColor/DirectColor visuals

Changes:

-  Improved device driver interface
-  tk.h renamed to gltk.h to avoid conflicts with Tcl's Tk
-  Dithering support moved from core into device driver

Bug fixes:

-  glEnable/Disable( GL_LIGHTING ) didn't always take effect
-  glReadPixels byte swapping was broken
-  glMaterial with pname==GL_AMBIENT_AND_DIFFUSE was broken
-  duplicate glColor4b() prototype in GL/gl.h removed
-  stripes in wave -ci demo fixed
-  GL_LINEAR_MIPMAP_NEAREST had wrong value
-  bugs in HP Color Recovery support fixed
-  fixed bug when blending lines, points, bitmaps outside of window

1.2.5 November 30, 1995
-----------------------

New Features:

-  updated MS Windows driver
-  new implementation of StaticGray/GrayScale visual support

Bug fixes:

-  pixelzooming with gamma correction or blending didn't work
-  HP color recovery visual wasn't being picked by glXChooseVisual
-  glClear didn't always observe glColorMask changes
-  olympic and offset demos didn't compile on some Suns
-  texcoord clamping wasn't correct
-  a polygon optimization introduced an occasional sampling problem

1.2.6 January 26, 1996
----------------------

New Features:

-  faster line and polygon rendering under certain conditions. See
   Performance Tips 9 and 10 in README
-  profiling
-  lighting is a bit faster
-  better perspective corrected texture mapping
-  Amiga AmiWin (X11) support
-  preliminary Linux SVGA driver Changes:
-  now using a 16-bit depth buffer, faster, smaller
-  GL_NORMALIZE is disabled by default

Bug fixes:

-  projective texture mapping
-  fixed a memory leak in the context destroy function
-  GL_POLYGON with less than 3 vertices caused a crash
-  glGet*() returned wrong result for GL_INDEX_MODE
-  reading pixels from an unmapped X window caused a BadMatch error

1.2.7 March 5, 1996
-------------------

New:

-  faster lighting
-  faster 16-bit TrueColor rendering on Linux
-  faster 32-bit TrueColor rendering on Linux, HP, IBM
-  non-depth-buffered XImage polygons are faster
-  vertex array extension
-  software alpha planes
-  updated Macintosh driver
-  new NeXT driver
-  GLU quadric functions generate texture coordinates
-  reflect.c demo - reflective, textured surface demo

Changes:

-  gamma correction code moved into the X driver for better performance

Bug fixes:

-  multiple glClipPlane()'s didn't work reliably
-  glPolygonMode() didn't always work
-  glCullFace( GL_FRONT_AND_BACK ) didn't work
-  texture mapping with gamma correction was buggy
-  floating point exceptions in texture coordinate interpolation
-  XImage byte swapping didn't always work
-  polygon edge flags weren't always used correctly

1.2.8 May 22, 1996
------------------

New:

-  overlay planes on X servers with the SERVER_OVERLAY_VISUALS property
-  better monochrome output
-  more IRIX 6.x configurations
-  more robust RGB mode color allocation
-  added MESA_XSYNC environment variable
-  GLX_MESA_pixmap_colormap and GLX_EXT_visual_info extensions
-  GL_MESA_window_pos extension
-  faster glReadPixels/glDrawPixels for GL_DEPTH and GL_UNSIGNED_SHORT
   and GL_UNSIGNED_INT
-  driver for prototype Cirrus Mondello 3-D board
-  updated AmigaDOS driver
-  a few small speed optimizations in polygon rendering

Changes:

-  internal device driver interface modified to simplify device driver
   implementations and to support hardware Z buffers
-  several changes to the X/Mesa interface (xmesa.h)

Bug fixes:

-  fixed pow(0,0) domain error triggered on some systems
-  glStencilClear() in a display list caused an infinite loop
-  glRasterPos*() was sometimes off by +/-0.5 in X and Y
-  color masking and blending were performed in wrong order
-  auxSolidCylinder() sometimes drew a wire-frame cylinder
-  fixed file writing bug in osdemo.c
-  pixel mapping didn't always work
-  the GL_GEQUAL stencil func didn't work
-  the GL_INVERT stencil op didn't work
-  the stencil write mask didn't work
-  glPush/PopAttrib() didn't do enough error checking
-  glIsList() didn't always work correctly

2.0 October 10, 1996
--------------------

New:

-  Implements OpenGL 1.1 API functions
-  all texture filtering modes supported (mipmapping)
-  faster texture mapping, see Performance Tip 11 in README
-  antialiased RGB points
-  X support for line and polygon stippling
-  glDrawBuffer( GL_FRONT_AND_BACK ) works
-  util/ directory of useful stuff
-  demos/texobj demo of texture objects

Changes:

-  major internal changes for thread-safeness
-  new device driver interface
-  MESA_ALPHA env variable removed
-  triangle rasterizer replaces polygon rasterizer

Bug fixes:

-  glPopAttrib() bug
-  glDrawBuffer(GL_NONE) works now

2.1 December 14, 1996
---------------------

New:

-  VMS support
-  MS-DOS driver
-  OpenStep support
-  updated, combined Windows 95/NT driver
-  implemented glGetLighti() and glGetTexGen*()
-  GLX does garbage collection of ancillary buffers

Bug fixes:

-  removed unused \_EXT constants from gl.h
-  fixed polygon offset bugs
-  Z coordinates of clipped lines were incorrect
-  glEdgeFlag() in display lists didn't always work
-  glLight*() in display lists didn't work
-  fixed X line stipple bugs (Michael Pichler)
-  glXUseXfonts XFreeFont/XFreeFontInfo bug fixed
-  fixed a feedback bug
-  glTexGen*() now transforms GL_EYE_PLANE by inverse modelview matrix
-  polygons were sometimes culled instead of clipped
-  triangle rasterizer suffered from float/int overflow exceptions
-  fixed FP underflow exception in lighting (specular exponent)
-  glEnable/glDisable of GL_EXT_vertex_array enums didn't work
-  fixed free(NULL) in GLU tesselator code
-  using 24-bit color on some X servers resulted in garbage rendering
-  32-bit per pixel mode for XFree86 now works
-  glRotate(a,0,0,0) gave unpredictable results
-  GL_LINE_STRIP with > 480 vertices had occasional clipping problems
-  8-bit TrueColor GLXPixmap rendering incorrectly required a colormap
-  glMaterial() wasn't ignored when GL_COLOR_MATERIAL was enabled
-  glEnable(GL_COLOR_MATERIAL) followed by glColor() didn't work right
-  accumulation buffer was limited to positive values
-  projective textures didn't work
-  selection buffer overflows weren't handled correctly

Changes:

-  restored the GL_EXT_polygon_offset extension
-  slightly faster RGB dithering
-  the SVGA driver works again
-  Amiga driver now distributed separately
-  NeXT driver updated for Mesa 2.x

2.2 March 14, 1997
------------------

New:

-  better color selection when dithering
-  added GL_EXT_texture_object extension
-  updated MS-DOS driver for DJGPP
-  added openbsd make configuration
-  faster dithered flat-shaded triangles
-  various compilation problems with Motif widgets fixed
-  gl.h, glx.h and glu.h name mangling option
-  BeOS driver
-  3D texture mapping extension
-  GL_MESA_resize_buffers extension
-  morph3d, stex3d and spectex demos
-  3Dfx support

Bug fixes:

-  glColorMaterial should finally work right in all respects
-  linear interpolation of mipmap levels was incorrectly weighted
-  readpix.c didn't compile on Macintosh
-  GL_INVERT and related logic ops didn't work right
-  glTexImage[12]D() didn't check its parameters consistantly
-  fixed a memory leak in glTexImage[12]D()
-  kludged around a SunOS 5.x/GCC compiler bug in the feedback code
-  glReadPixels aborted instead of normally catching some errors
-  a few 1.1 constants were missing or misnamed in gl.h
-  glBegin(p); glBegin(q); didn't generate an error
-  fixed a memory leak in GLX code
-  clipping of concave polygons could cause a core dump
-  1-component alpha texture maps didn't work
-  fixed a GLU polygon tesselator bug
-  polygons with colinear vertices were sometimes culled
-  feedback triangle colors were wrong when using smooth shading
-  textures with borders didn't work correctly
-  colors returned in feedback mode were wrong when using lighting
-  spotlights didn't effect ambient lighting correctly
-  gluPartialDisk() had a few bugs

Changes:

-  device driver interface expanded to support texture mapping
-  faster matrix inversion subroutine
-  commented out #include "wmesa_extend.h" from src/wmesa.c
-  fixed many compiler warnings in the demo programs

2.3 June 30, 1997
-----------------

New:

-  Mesa distribution divided into two pieces: library code and demos
-  faster vertex transformation, clip testing, lighting
-  faster line drawing
-  TrueColor visuals how have dithering (for depths < 24 bits)
-  added MESA_NO_DITHER environment variable
-  new device driver function: NearFar(), RenderVB(), RasterSetup()
-  added LynxOS configuration
-  added cygnus Win32 configuration
-  added texcyl.c GLUT demo
-  added XMesaDitherColor() to X/Mesa interface
-  new NURBS code from Bogdan Sikorski
-  added demos/shape.c (non-rectangular X window!)

Bug fixes:

-  glEnable/DisableClientState() were missing from GL/gl.h
-  GL_SPHERE_MAP texcoord generation didn't work correctly
-  glXGetConfig() returned wrong number of depth, stencil, accum bits
-  glDrawPixels feedback/selection didn't examine RasterPos valid bit
-  black and white were reversed on some monochrome displays
-  fixed potential image memory leak (wasn't setting reference counter)
-  glDrawPixels sometimes didn't recognize some GL state changes
-  gluProject/UnProject() didn't check for divide by zero
-  stex3d demo called random() and srandom(), not portable
-  fixed memory leaks in context.c and drawpix.c
-  fixed NULL dereferencing problem in gl_update_texture_state()
-  glReadPixels between glBegin/glEnd didn't generate an error.
-  fixed memory leak in polygon tesselator (Randy Frank)
-  fixed seg fault bug drawing flat-shaded, depth-tested lines
-  clipped GL_TRIANGLE_STRIPs sometimes had wrong color when flat-shaded
-  glBindTexture sometimes didn't work
-  fixed a bug deep in glXReleaseBuffersMESA()
-  fog was mistakenly applied to alpha
-  glPopMatrix didn't set "dirty matrix" flag
-  glPolygonStipple pattern was sometimes wrong
-  glClear wasn't disabled during feedback and selection
-  fixed memory leak in glTexSubImage[123]D

Changes:

-  many library source files reorganized
-  faster X color allocation, colors also freed when finished with them
-  new texture sampling function pointer in texture objects
-  incorporated 3Dfx VooDoo driver v0.16 into main source tree
-  many 3Dfx driver updates
-  cygnus Makefiles now included
-  updated DOS driver
-  made a few changes to dosmesa.c and wmesa.c (VB->Unclipped)
-  internally, colors now stored in GLubytes, not GLfixed
-  optimized changing of GL_SHININESS parameter

2.4 September 18, 1997
----------------------

New:

-  updated 3Dfx Glide driver
-  hacks for 3Dfx rendering into an X window or fullscreen
-  added depth buffer access functions to X/Mesa and OS/Mesa interfaces

Bug fixes:

-  pixel buffer could overflow with long, wide lines
-  fixed FP underflow problems in lighting
-  glTexSubImage1D() had an unitialized variable
-  incomplete texture objects could cause a segfault
-  glDrawPixels with GL_COMPILE_AND_EXECUTE caused infinite loop
-  flat-shaded quads in a strip were miscolored if clipped
-  mipmapped triangle lod computation now works correctly
-  fixed a few under/overflow bugs in triangle rasterizer
-  glArrayElement() assigned bad normal if normal array disabled
-  changed argument to glXReleaseBuffersMESA()
-  fixed small triangle underflow bugs in tritemp.h (hopefully)
-  glBindTexture(target, 0) caused a crash
-  glTexImage[123]D() with NULL image pointer caused crash
-  glPixelStore parameters are now ignored during display list execution
-  fixed a two-sided lighting w/ clipping bug (black vertices)
-  textures with width!=height were sometimes mis-rendered
-  "weird" projection matrices could cause div by 0, other fp errors

Changes:

-  changed precompiled header symbol from PCH to PC_HEADER
-  split api.c into api1.c and api2.c
-  added hash.c source file (but not used yet)
-  a few Sun and HP configuration file changes
-  MESA_GLX_FX env var replaces MESA_FX_WINDOW and MESA_FX_FULLSCREEN
-  fixed a few cygnus build problems (src/Makefile.cygnus, src/wmesa.c)

2.5 November 20, 1997
---------------------

New:

-  updated 3Dfx driver (v20) for GLQuake
-  added GL_EXT_paletted_texture extension
-  added GL_EXT_shared_texture_palette extension
-  added GL_EXT_point_parameters extension
-  now including Mark Kilgard's GLUT library v3.6
-  new GLUT-based demos in gdemos/
-  added a few more Unix config targets
-  added Intel X86 assembly language vertex transformation code
-  3Dfx/Glide driver for Mesa now recognizes SST_SCREENREFRESH env var
-  Windows 95 S3 Virge driver

Bug fixes:

-  glCopyTexImage?D would crash due to uninitialized variable
-  glColor w/ glColorMaterial in a display list caused a bug
-  fixed several glDrawPixels() and ReadPixels() bugs in 3Dfx driver
-  glVertex4*() vertices weren't always projected correctly
-  trying to use mipmapped textured points or lines caused crash
-  glColor[34][fd]() values now clamped to [0,1] before int conversion

Changes:

-  new device driver functions for texture mapping
-  hash tables used for display list and texture object lookup
-  fixed GLX visual handling code to avoid saving redundant visuals
-  3Dfx Glide libraries automatically linked to libMesaGL.so
-  dropped the Cirrus Logic Mondello code since it's obsolete
-  updated Cygnus Makefiles (Stephane Rehel)
-  updated Windows MSVC++ Makefiles (Oleg Letsinsky)
-  procedure for making library files has changed: scripts now take a
   major and minor version arguments. Make-config changed a lot.
-  new implementation of glTexSubImage2D()
-  updated widgets-mesa directory to create libMesaGLwM.a (Motif widget)
-  separate linux-glide and linux-386-glide configurations

2.6 February 12, 1998
---------------------

New:

-  Windows WGL functions
-  updated VMS, DOS, Windows, Cygnus, BeOS, Amiga compilation support
-  v0.22 of 3Dfx Glide driver
-  more X86 assembly language optimizations
-  faster blending for some modes
-  XMesaSetFXmode() to switch between 3Dfx window and full-screen mode
-  added preliminary thread support
-  added GLX_MESA_copy_sub_buffer extension
-  some clipping optimizations

Bug fixes:

-  fixed shading/material bug when drawing long primitive strips
-  fixed clipping problem in long primitive strips
-  fixed clipping bug when using 3Dfx driver
-  fixed a problem when trying to use X fonts w/ 3Dfx driver
-  fixed a texture filter bug in 3Dfx/Glide driver
-  fixed bug in 3Dfx/Glide driver involving depth mask & clearing
-  glLoadMatrix to set projection matrix confused the 3Dfx driver
-  non-identity texture matrices didn't work with linux-386 configs
-  glGenTextures() didn't reserve the returned texture IDs
-  NULL proxy image sent to glTexImageXD() caused crash
-  added texture state validation optimization (Henk Kok)
-  fixed colormap reuse problem when using both RGB and CI windows
-  32bpp True/DirectColor X visuals weren't recognized
-  fixed potential problem in evaluators memory allocation
-  fixed assorted demo compilation bugs

Changes:

-  replaced old Mesa/windows/ directory with Mesa/WIN32/ directory
-  converted a few old glaux/gltk demos to GLUT
-  renamed directories: demos -> xdemos, gdemos -> demos

3.0 September 17, 1998
----------------------

New:

-  OpenGL 1.2 API
-  GL_EXT_abgr pixel format extension
-  GL_SGIS_texture_edge_clamp extension
-  GL_SGIS_multitexture extension (to be replaced by GL_ARB_multitex)
-  GL_EXT_multitexture extension (to be replaced by GL_ARB_multitex)
-  GL_EXT_rescale_normal extension and renormal.c demo
-  GLX_SGI_video_sync extension (a no-op)
-  antialiased lines
-  glGetTexImage() now implemented
-  glDraw/Copy/ReadPixels() optimizations
-  optimized textured triangle code (Marten Stromberg)
-  more optimization of dithered TrueColor triangles in X driver
-  Linux GGI driver
-  updated MGL driver

Bug fixes:

-  lots of assorted compilation fixes
-  glInitNames didn't write initial hit record
-  glBitmap didn't always check for invalid raster position
-  switching between GLX and OSMesa contexts caused a crash
-  fixed uninitialized variable in Mesa widget code
-  fixed typo in texture code which caused book/texgen to crash
-  fixed texture sampling bug when filter=GL_LINEAR and wrap=GL_CLAMP
-  gluDisk() in POINT or LINE mode sometimes failed
-  fixed texture + fog bug
-  GL_COMPILE_AND_EXECUTE mode didn't work reliably
-  glMultMatrix in projection matrix mode w/ 3Dfx driver could fail
-  glDrawPixels(color index pixels) weren't converted to RGBA
-  fixed possible getenv() buffer overflow security bug
-  glBitmap in feedback mode was offset by xOrig, yOrig params
-  device driver's DrawPixels hook was never used
-  glDrawPixels with zoomY!=1 and top/bottom clipping didn't work
-  glDrawPixels optimized for GL_LUMINANCE, GL_LUMINANCE_ALPHA, GLubyte
-  fixed MakeCurrent bug in GLwRedrawObjects() in MesaWorkstation.c
-  glCopyTexSubImage2D() didn't work with 3Dfx driver
-  lines with width = 2 could cause crash
-  glClear with scissor rect sometimes cleared whole buffer
-  glTexSubImage2D( .. GL_COLOR_INDEX .. ) didn't work
-  glTexImageXD( .. GL_ABGR_EXT .. ) didn't work
-  computation of inverse modelview matrix sometimes failed
-  fixed GL_CLAMP mode texture sampling bug
-  textured line interpolation was somewhat broken
-  textured triangle interpolation was also somewhat broken
-  glGet(MODELVIEW/PROJECTION/TEXTURE_MATRIX_STACK_DEPTH) off by one
-  evaluator state wasn't fully initialized
-  texture coordinate clipping was buggy
-  evaluator surfaces could be mis-colored
-  glAccum(GL_RETURN, s) didn't obey glColorMask() settings
-  zero area polygons shouldn't be culled if polygon mode is point/line
-  clipped width and height of glReadPixels was sometimes off by one
-  blending with alpha = 0 or 1.0 wasn't always exact
-  reading of pixels from clipped region was buggy
-  minor tweaking of X visual management in GLX emulator
-  glPolygonStipple now obeys pixel unpacking parameters
-  glGetPolygonStipple now obeys pixel packing parameters
-  interleaved vertex array texture coordinates were broken
-  query of proxy texture internal format was broken
-  alpha channel wasn't reliably cleared
-  fixed divide by zero error in gluScaleImage if dest size = 1 x 1

Conformance bug fixes:

-  GL_SELECTION_BUFFER_POINTER and GL_SELECTION_BUFFER_SIZE were missing
-  GL_TEXTURE_INTERNAL_FORMAT was missing
-  glGet*(GL_POLYGON_STIPPLE) was broken
-  glPush/PopAttrib() didn't save/restore all texture state
-  glBitmap in feedback mode didn't work
-  feedback of texture coords didn't always work
-  glDrawPixels w/ format=GL_DEPTH_COMPONENT, type=GLbyte was broke
-  glDrawPixels w/ format=GL_DEPTH_COMPONENT, type=GLubyte was broke
-  glDrawPixels w/ format=GL_STENCIL_INDEX, type=GL_BITMAP was broke

Changes:

-  upgraded GLUT to version 3.7
-  only GL and GLU library code included in MesaLib.tar.gz
-  GLUT and all demos now in MesaDemos.tar.gz
-  glaux and gltk libraries removed
-  IRIX -n32 and -64 libs go in lib32/ and lib64/ directories

3.1 beta 1 November 19, 1998
----------------------------

New:

-  GL_EXT_stencil_wrap extension
-  GL_INGR_blend_func_separate extension
-  GL_ARB_multitexture extension
-  GL_NV_texgen_reflection extension
-  newly optimized vertex transformation code
-  updated GLUT 3.7 code
-  better precision when using 32-bit Z buffer
-  Allegro DJGPP driver

Bug fixes:

-  glCopyPixels between front/back buffers didn't copy alpha correctly
-  fixed out-of-bounds memory access in optimized 2-D texture code
-  glPixelStorei didn't accept GL_PACK/UNPACK_IMAGE_HEIGHT parameter
-  glGet*() didn't accept GL_MAX_3D_TEXTURE_SIZE parameter
-  clipping of texture coordinates sometimes had bad R,Q values
-  GL_CLAMP_TO_EDGE texture sampling was off by 0.5 texels
-  glEdgeFlagPointer() now takes a GLvoid \* instead of GLboolean \*
-  texture was sometimes applied twice with 3Dfx driver
-  glPush/PopAttrib() fouled up texture object reference counts
-  glDeleteLists(0, n) caused assertion failure
-  bilinear texture sampling wasn't accurate enough
-  glClear w/ glDepthMask(GL_FALSE) didn't work right on 3Dfx
-  color components were reversed on big endian 32 bpp X visuals

Changes:

-  removed GL_EXT_multitexture extension

3.1 beta 2 May 24, 1999
-----------------------

New:

-  multi-textured points and lines (mjk@nvidia.com)
-  optimized 24bpp X rendering (bernd.paysan@gmx.de)
-  added allegro support (bernie-t@geocities.com)
-  cleaned-up Windows-related stuff (Ted Jump)
-  minor stereo changes (KendallB@scitechsoft.com)
-  new BeOS driver which implements BGLView class
-  new Direct3D driver (see src/D3D)
-  more efficient filled gluCylinder() function
-  utilities: util/showbuffer.[ch] and util/glstate.[ch]
-  fixed some IRIX compiler warnings
-  added support for building Mesa in XFree86 with SGI's GLX
   (kevin@precisioninsight.com)

Bug fixes:

-  a variety of Windows/Mesa bug fixes (mjk@nvidia.com)
-  packed pixel images weren't unpacked correctly
-  patches some win32 files in GLUT (mjk@nvidia.com)
-  glTexImage[123]D() didn't accept internalFormat == GL_COLOR_INDEX
-  fixed lighting bug in Keith's new shading code
-  fixed texture segfault seen in Lament screensaver
-  fixed miscellaneous low-memory bugs
-  glClear(GL_COLOR_BUFFER_BIT) with RGBA or CI masking was broken
-  GL_LINEAR sampling of 3D textures was broken
-  fixed SVR4 'cc' compiler macro problem (dawes@xfree86.org)
-  added GL_TEXTURE_PRIORITY fix (keithh@netcomuk.co.uk)
-  fixed wide point and wide line conformance bugs (brianp)

Changes:

-  some device driver changes (see src/dd.h)
-  new copyright on core Mesa code

3.1 beta 3 September 17, 1999
-----------------------------

New:

-  optimized glAccum function
-  optimized 24bpp rendering in XMesa driver
-  GLU 1.2 polygon tessellator

Bug Fixes:

-  glGetTexLevelParameter wasn't fully implemented
-  glXUseXFont now handles multi-byte fonts
-  glIsEnabled(GL_TEXTURE_2D / 3D) returned wrong result
-  alpha channel of blending points, lines was sometimes incorrect

Changes:

-  New library names: "libGL" instead of "libMesaGL"
-  New library numbering: libGL.so.1.2.310
-  New subdirectories: docs/ and bin/
-  New Makefile-system (autoconf,automake,libtool)

3.1 final December 14, 1999
---------------------------

New:

-  added demos/gloss.c
-  added xdemos/glxdpyinfo.c
-  added GLX_ARB_get_proc_address extension
-  rewritten glTexImage code paths (faster, less memory, bug fixes)

Bug Fixes:

-  several vertex array bug fixes
-  overlapping glCopyPixels with pixel zooming now works
-  glXUseXFont() bitmaps were vertically shifted by one pixel
-  glCopyPixels with pixel zooming now works

3.2 final April 24, 2000
------------------------

Bug fixes:

-  fixed memcpy bugs in span.c
-  fixed missing glEnd problem in demos/tessdemo.c
-  fixed bug when clearing 24bpp Ximages
-  fixed clipping problem found in Unreal Tournament
-  fixed Loki's "ice bug" and "crazy triangles" seen in Heretic2
-  fixed Loki's 3dfx RGB vs BGR bug
-  fixed Loki's 3dfx smooth/flat shading bug in SoF

Changes:

-  updated docs/README file
-  use bcopy() optimizations on FreeBSD
-  re-enabled the optimized persp_textured_triangle() function

3.2.1 July 19, 2000
-------------------

Bug fixes:

-  gluBuild2DMipmaps() didn't accept GL_BGRA
-  Fixed compile/makefile problems on IRIX
-  fixed segfault in 3dfx driver when using GL selection/feedback
-  no longer cull very, very tiny triangles
-  blending w/ drawbuffer==GL_FRONT_BACK caused segfault (sw rendering)
-  fixed Motif detection code in widgets-mesa/configure.in
-  glColorMaterial and glMaterial updates to emissive and ambient didn't
   always work right
-  Specular highlights weren't always in the right place
-  clipped GL_LINE mode polygons had interior lines appear
-  blend term GL_ONE_MINUS_CONSTANT_ALPHA was broken
-  GL_NICEST fog didn't always work with flat shading
-  glRect commands in display lists were sometimes miscolored
-  Line Z offset didn't always work
-  fixed texgen normal vector problem (gloss's teapot)
-  numerous GL conformance bugs fixed

Changes:

-  glColorMask(false, false, false, false) handled better/faster
-  reverted to old GLU polygon tessellator, GLU 1.1
-  updated Win32 build files

3.3 July 21, 2000
-----------------

New:

-  antialiased triangles now implemented
-  GL_EXT_texture_env_add texture mode extension
-  GLX 1.3 API
-  support for separate draw/read buffers (ie GL_SGI_make_current_read)
-  thread-safe API dispath
-  improved glxinfo program
-  demos/texdown program to measure texture download performance
-  glext.h header file
-  demos/geartrain program
-  GL_EXT_texture_lod_bias extension
-  demos/lodbias program
-  further optimized glRead/DrawPixels for 16-bit TrueColor X visuals
-  GLX_EXT_visual_rating extension (a no-op, however)
-  GL_HP_occlusion_test extension (for X and OS/Mesa drivers)
-  demos/occlude program
-  GL_SGIS_pixel_texture and GL_SGIX_pixel_texture extensions
-  demos/pixeltex program
-  GL_SGI_color_matrix extension
-  GL_SGI_color_table extension
-  GL_EXT_histogram extension
-  GL_ARB_texture_cube_map extension
-  added xdemos/glxheads and xdemos/manywin
-  demos/texenv.c demo
-  GL_EXT_texture_env_combine extension (by Holger Waechtler)
-  Xlib driver is now thread-safe (see xdemos/glthreads)

Bug Fixes:

-  various GL conformance failures fixed since 3.2.1

Changes:

-  gl.h now uses #defines instead of C enums for all tokens
-  glu.h now uses #defines instead of C enums for all tokens
-  moved programs from 3Dfx/demos/ into demos/ directory

3.4 November 3, 2000
--------------------

New:

-  optimized glDrawPixels for glPixelZoom(1,-1) Bug Fixes:
-  widgets-mesa/src/\*.c files were missing from 3.3 distro
-  include/GL/mesa_wgl.h file was missing from 3.3 distro
-  fixed some Win32 compile problems
-  texture object priorities weren't getting initialized to 1.0
-  glAreTexturesResident return value was wrong when using hardware
-  glXUseXFont segfaulted when using 3dfx driver (via MESA_GLX_FX)
-  glReadPixels with GLushort packed types was broken
-  fixed a few bugs in the GL_EXT_texture_env_combine texture code
-  glPush/PopAttrib(GL_ENABLE_BIT) mishandled multi-texture enables
-  fixed some typos/bugs in the VB code
-  glDrawPixels(GL_COLOR_INDEX) to RGB window didn't work
-  optimized glDrawPixels paths weren't being used
-  per-fragment fog calculation didn't work without a Z buffer
-  improved blending accuracy, fixes Glean blendFunc test failures
-  glPixelStore(GL_PACK/UNPACK_SKIP_IMAGES) wasn't handled correctly
-  glXGetProcAddressARB() didn't always return the right address
-  gluBuild[12]DMipmaps() didn't grok the GL_BGR pixel format
-  texture matrix changes weren't always detected (GLUT projtex demo)
-  fixed random color problem in vertex fog code
-  fixed Glide-related bug that let Quake get a 24-bit Z buffer

Changes:

-  finished internal support for compressed textures for DRI

3.4.1 February 14, 2001
-----------------------

New:

-  fixed some Linux build problems
-  fixed some Windows build problems
-  GL_EXT_texture_env_dot3 extension (Gareth Hughes)

Bug fixes:

-  added RENDER_START/RENDER_FINISH macros for glCopyTexImage in DRI
-  various state-update code changes needed for DRI bugs
-  disabled pixel transfer ops in glColorTable commands, not needed
-  fixed bugs in glCopyConvolutionFilter1D/2D, glGetConvolutionFilter
-  updated sources and fixed compile problems in widgets-mesa/
-  GLX_PBUFFER enum value was wrong in glx.h
-  fixed a glColorMaterial lighting bug
-  fixed bad args to Read/WriteStencilSpan in h/w stencil clear function
-  glXCopySubBufferMESA() Y position was off by one
-  Error checking of glTexSubImage3D() was broken (bug 128775)
-  glPopAttrib() didn't restore all derived Mesa state correctly
-  Better glReadPixels accuracy for 16bpp color - fixes lots of OpenGL
   conformance problems at 16bpp.
-  clearing depth buffer with scissoring was broken, would segfault
-  OSMesaGetDepthBuffer() returned bad bytesPerValue value
-  fixed a line clipping bug (reported by Craig McDaniel)
-  fixed RGB color over/underflow bug for very tiny triangles

Known problems:

-  NURBS or evaluator surfaces inside display lists don't always work

3.4.2 May 17, 2001
------------------

Bug fixes:

-  deleting the currently bound texture could cause bad problems
-  using fog could result in random vertex alpha values
-  AA triangle rendering could touch pixels outside right window bound
-  fixed byteswapping problem in clear_32bit_ximage() function
-  fixed bugs in wglUseFontBitmapsA(), by Frank Warmerdam
-  fixed memory leak in glXUseXFont()
-  fragment sampling in AA triangle function was off by 1/2 pixel
-  Windows: reading pixels from framebuffer didn't always work
-  glConvolutionFilter2D could segfault or cause FP exception
-  fixed segfaults in FX and X drivers when using tex unit 1 but not 0
-  GL_NAND logicop didn't work right in RGBA mode
-  fixed a memory corruption bug in vertex buffer reset code
-  clearing the softwara alpha buffer with scissoring was broken
-  fixed a few color index mode fog bugs
-  fixed some bad assertions in color index mode
-  fixed FX line 'stipple' bug #420091
-  fixed stencil buffer clear width/height typo
-  fixed GL error glitches in gl[Client]ActiveTextureARB()
-  fixed Windows compilation problem in texutil.c
-  fixed 1/8-pixel AA triangle sampling error

Changes:

-  optimized writing mono-colored pixel spans to X pixmaps
-  increased max viewport size to 2048 x 2048

3.5 June 21, 2001
-----------------

New:

-  internals of Mesa divided into modular pieces (Keith Whitwell)
-  100% OpenGL 1.2 conformance (passes all conformance tests)
-  new AA line algorithm
-  GL_EXT_convolution extension
-  GL_ARB_imaging subset
-  OSMesaCreateContextExt() function
-  GL_ARB_texture_env_add extension (same as GL_EXT_texture_env_add)
-  GL_MAX_TEXTURE_UNITS_ARB now defaults to eight
-  GL_EXT_fog_coord extension (Keith Whitwell)
-  GL_EXT_secondary_color extension (Keith Whitwell)
-  GL_ARB_texture_env_add extension (same as GL_EXT_texture_env_add)
-  GL_SGIX_depth_texture extension
-  GL_SGIX_shadow and GL_SGIX_shadow_ambient extensions
-  demos/shadowtex.c demo of GL_SGIX_depth_texture and GL_SGIX_shadow
-  GL_ARB_texture_env_combine extension
-  GL_ARB_texture_env_dot3 extension
-  GL_ARB_texture_border_clamp (aka GL_SGIS_texture_border_clamp)
-  OSMesaCreateContextExt() function
-  libOSMesa.so library, contains the OSMesa driver interface
-  GL/glxext.h header file for GLX extensions
-  somewhat faster software texturing, fogging, depth testing
-  all color-index conformance tests now pass (only 8bpp tested)
-  SPARC assembly language TCL optimizations (David Miller)
-  GL_SGIS_generate_mipmap extension

Bug Fixes:

-  fbiRev and tmuRev were unitialized when using Glide3
-  fixed a few color index mode conformance failures; all pass now
-  now appling antialiasing coverage to alpha after texturing
-  colors weren't getting clamped to [0,1] before color table lookup
-  fixed RISC alignment errors caused by COPY_4UBV macro
-  drawing wide, flat-shaded lines could cause a segfault
-  vertices now snapped to 1/16 pixel to fix rendering of tiny triangles

Changes:

-  SGI's Sample Implementation (SI) 1.3 GLU library replaces Mesa GLU
-  new libOSMesa.so library, contains the OSMesa driver interface

4.0 October 22, 2001
--------------------

New:

-  Mesa 4.0 implements the OpenGL 1.3 specification
-  GL_IBM_rasterpos_clip extension
-  GL_EXT_texture_edge_clamp extension (aka GL_SGIS_texture_edge_clamp)
-  GL_ARB_texture_mirrored_repeat extension
-  WindML UGL driver (Stephane Raimbault)
-  added OSMESA_MAX_WIDTH/HEIGHT queries
-  attempted compiliation fixes for Solaris 5, 7 and 8
-  updated glext.h and glxext.h files
-  updated Windows driver (Karl Schultz)

Bug fixes:

-  added some missing GLX 1.3 tokens to include/GL/glx.h
-  GL_COLOR_MATRIX changes weren't recognized by teximage functions
-  glCopyPixels with scale and bias was broken
-  glRasterPos with lighting could segfault
-  glDeleteTextures could leave a dangling pointer
-  Proxy textures for cube maps didn't work
-  fixed a number of 16-bit color channel bugs
-  fixed a few minor memory leaks
-  GLX context sharing was broken in 3.5
-  fixed state-update bugs in glPopClientAttrib()
-  fixed glDrawRangeElements() bug
-  fixed a glPush/PopAttrib() bug related to texture binding
-  flat-shaded, textured lines were broken
-  fixed a dangling pointer problem in the XMesa code (Chris Burghart)
-  lighting didn't always produce the correct alpha value
-  fixed 3DNow! code to not read past end of arrays (Andrew Lewycky)

4.0.1 December 17, 2001
-----------------------

New:

-  better sub-pixel sample positions for AA triangles (Ray Tice)
-  slightly faster blending for (GL_ZERO, GL_ONE) and (GL_ONE, GL_ZERO)

Bug fixes:

-  added missing break statements in glGet*() for multisample cases
-  fixed uninitialized hash table mutex bug (display lists / texobjs)
-  fixed bad teximage error check conditional (bug 476846)
-  fixed demos readtex.c compilation problem on Windows (Karl Schultz)
-  added missing glGet() query for GL_MAX_TEXTURE_LOD_BIAS_EXT
-  silence some compiler warnings (gcc 2.96)
-  enable the #define GL_VERSION_1_3 in GL/gl.h
-  added GL 1.3 and GLX 1.4 entries to gl_mangle.h and glx_mangle.h
-  fixed glu.h typedef problem found with MSDev 6.0
-  build libGL.so with -Bsymbolic (fixes bug found with Chromium)
-  added missing 'const' to glXGetContextIDEXT() in glxext.h
-  fixed a few glXGetProcAddress() errors (texture compression, etc)
-  fixed start index bug in compiled vertex arrays (Keith)
-  fixed compilation problems in src/SPARC/glapi_sparc.S
-  fixed triangle strip "parity" bug found in VTK medical1 demo (Keith)
-  use glXGetProcAddressARB in GLUT to avoid extension linking problems
-  provoking vertex of flat-shaded, color-index triangles was wrong
-  fixed a few display list bugs (GLUT walker, molecule, etc) (Keith)
-  glTexParameter didn't flush the vertex buffer (Ray Tice)
-  feedback attributes for glDraw/CopyPixels and glBitmap were wrong
-  fixed bug in normal length caching (ParaView lighting bug)
-  fixed separate_specular color bug found in Chimera (18 Dec 2001)

4.0.2 April 2, 2002
-------------------

New:

-  New DOS (DJGPP) driver written by Daniel Borca
-  New driver interface functions for TCL drivers (such as Radeon DRI)
-  GL_RENDERER string returns "Mesa Offscreen16" or "Mesa Offscreen32"
   if using deep color channels
-  latest GL/glext.h and GL/glxext.h headers from SGI

Bug fixes:

-  GL_BLEND with non-black texture env color wasn't always correct
-  GL_REPLACE with GL_RGB texture format wasn't always correct (alpha)
-  glTexEnviv( pname != GL_TEXTURE_ENV_COLOR ) was broken
-  glReadPixels was sometimes mistakenly clipped by the scissor box
-  glDraw/ReadPixels didn't catch all the errors that they should have
-  Fixed 24bpp rendering problem in Windows driver (Karl Schultz)
-  16-bit GLchan mode fixes (m_trans_tmp.h, s_triangle.c)
-  Fixed 1-bit float->int conversion bug in glDrawPixels(GL_DEPTH_COMP)
-  glColorMask as sometimes effecting glXSwapBuffers()
-  fixed a potential bug in XMesaGarbageCollect()
-  N threads rendering into one window didn't work reliably
-  glCopyPixels didn't work for deep color channels
-  improved 8 -> 16bit/channel texture image conversion (Gerk Huisma)
-  glPopAttrib() didn't correctly restore user clip planes
-  user clip planes failed for some perspective projections (Chromium)

Known bugs:

-  mipmap LOD computation

4.0.3 June 25, 2002
-------------------

New:

-  updated GL/glext.h file (version 15)
-  corrected MMX blend code (Jose Fonseca)
-  support for software-based alpha planes in Windows driver
-  updated GGI driver (Filip Spacek)

Bug fixes:

-  glext.h had wrong values for GL_DOT3_RGB[A]_EXT tokens
-  OSMesaMakeCurrent() didn't recognize buffer size changes
-  assorted conformance fixes for 16-bit/channel rendering
-  texcombine alpha subtraction mode was broken
-  fixed lighting bug with non-uniform scaling and display lists
-  fixed bug when deleting shared display lists
-  disabled SPARC cliptest assembly code (Mesa bug 544665)
-  fixed a couple Solaris compilation/link problems
-  blending clipped glDrawPixels didn't always work
-  glGetTexImage() didn't accept packed pixel types
-  glPixelMapu[is]v() could explode given too large of pixelmap
-  glGetTexParameter[if]v() didn't accept GL_TEXTURE_MAX_ANISOTROPY_EXT
-  glXCopyContext() could lead to segfaults
-  glCullFace(GL_FRONT_AND_BACK) didn't work (bug 572665)

Changes:

-  lots of C++ (g++) code clean-ups
-  lots of T&L updates for the Radeon DRI driver

Known bugs:

-  mipmap LOD computation (fixed for Mesa 4.1)

4.0.4 October 3, 2002
---------------------

New:

-  GL_NV_texture_rectangle extension
-  updated glext.h header (version 17)
-  updated DOS driver (Daniel Borca)
-  updated BeOS R5 driver (Philippe Houdoin)
-  added GL_IBM_texture_mirror_repeat
-  glxinfo now takes -l option to print interesting OpenGL limits info
-  GL_MESA_ycbcr_texture extension
-  GL_APPLE_client_storage extension (for some DRI drivers only)
-  GL_MESA_pack_invert extension

Bug fixes:

-  fixed GL_LINEAR fog bug by adding clamping
-  fixed FP exceptions found using Alpha CPU
-  3dfx MESA_GLX_FX=window (render to window) didn't work
-  fixed memory leak in wglCreateContest (Karl Schultz)
-  define GLAPIENTRY and GLAPI if undefined in glu.h
-  wglGetProcAddress didn't handle all API functions
-  when testing for OpenGL 1.2 vs 1.3, check for GL_ARB_texture_cube_map
-  removed GL_MAX_CONVOLUTION_WIDTH/HEIGHT from glGetInteger/Float/etc()
-  error checking in compressed tex image functions had some glitches
-  fixed AIX compile problem in src/config.c
-  glGetTexImage was using pixel unpacking instead of packing params
-  auto-mipmap generation for cube maps was incorrect

Changes:

-  max texture units reduced to six to accommodate texture rectangles
-  removed unfinished GL_MESA_sprite_point extension code

4.1 October 29, 2002
--------------------

New:

-  GL_NV_vertex_program extension
-  GL_NV_vertex_program1_1 extension
-  GL_ARB_window_pos extension
-  GL_ARB_depth_texture extension
-  GL_ARB_shadow extension
-  GL_ARB_shadow_ambient extension
-  GL_EXT_shadow_funcs extension
-  GL_ARB_point_parameters extension
-  GL_ARB_texture_env_crossbar
-  GL_NV_point_sprite extension
-  GL_NV_texture_rectangle extension
-  GL_EXT_multi_draw_arrays extension
-  GL_EXT_stencil_two_side extension
-  GLX_SGIX_fbconfig and GLX_SGIX_pbuffer extensions
-  GL_ATI_texture_mirror_once extension (Ian Romanick)
-  massive overhaul/simplification of software rasterizer module, many
   contributions from Klaus Niederkrueger
-  faster software texturing in some cases (i.e. trilinear filtering)
-  new OSMesaGetProcAddress() function
-  more blend modes implemented with MMX code (Jose Fonseca)
-  added glutGetProcAddress() to GLUT
-  added GLUT_FPS env var to compute frames/second in glutSwapBuffers()
-  pbinfo and pbdemo PBuffer programs
-  glxinfo -v prints transprent pixel info (Gerd Sussner)

Bug fixes:

-  better mipmap LOD computation (prevents excessive blurriness)
-  OSMesaMakeCurrent() didn't recognize buffer size changes
-  assorted conformance fixes for 16-bit/channel rendering
-  texcombine alpha subtraction mode was broken
-  fixed some blend problems when GLchan==GLfloat (Gerk Huisma)
-  clamp colors to [0,inf] in OSMesa if GLchan==GLfloat (Gerk Huisma)
-  fixed divide by zero error in NURBS tessellator (Jon Perry)
-  fixed GL_LINEAR fog bug by adding clamping
-  fixed FP exceptions found using Alpha CPU
-  3dfx/glide driver render-to-window feature was broken
-  added missing GLX_TRANSPARENT_RGB token to glx.h
-  fixed error checking related to paletted textures
-  fixed reference count error in glDeleteTextures (Randy Fayan)

Changes:

-  New spec file and Python code to generate some GL dispatch files
-  Glide driver defaults to "no" with autoconf/automake
-  updated demos/stex3d with new options

5.0 November 13, 2002
---------------------

New:

-  OpenGL 1.4 support (glGetString(GL_VERSION) returns "1.4")
-  removed some overlooked debugging code
-  glxinfo updated to support GLX_ARB_multisample
-  GLUT now support GLX_ARB_multisample
-  updated DOS driver (Daniel Borca)

Bug fixes:

-  GL_POINT and GL_LINE-mode polygons didn't obey cull state
-  fixed potential bug in \_mesa_align_malloc/calloc()
-  fixed missing triangle bug when running vertex programs
-  fixed a few HPUX compilation problems
-  FX (Glide) driver didn't compile
-  setting GL_TEXTURE_BORDER_COLOR with glTexParameteriv() didn't work
-  a few EXT functions, like glGenTexturesEXT, were no-ops
-  a few OpenGL 1.4 functions like glFogCoord*, glBlendFuncSeparate,
   glMultiDrawArrays and glMultiDrawElements were missing
-  glGet*(GL_ACTIVE_STENCIL_FACE_EXT) was broken
-  Pentium 4 Mobile was mistakenly identified as having 3DNow!
-  fixed one-bit error in point/line fragment Z calculation
-  fixed potential segfault in fakeglx code
-  fixed color overflow problem in DOT3 texture env mode

5.0.1 March 30, 2003
--------------------

New:

-  DOS driver updates from Daniel Borca
-  updated GL/gl_mangle.h file (Bill Hoffman) Bug fixes:
-  auto mipmap generation for cube maps was broken (bug 641363)
-  writing/clearing software alpha channels was unreliable
-  minor compilation fixes for OS/2 (Evgeny Kotsuba)
-  fixed some bad assertions found with shadowtex demo
-  fixed error checking bug in glCopyTexSubImage2D (bug 659020)
-  glRotate(angle, -x, 0, 0) was incorrect (bug 659677)
-  fixed potential segfault in texture object validation (bug 659012)
-  fixed some bogus code in \_mesa_test_os_sse_exception_support (Linus)
-  fix fog stride bug in tnl code for h/w drivers (Michel Danzer)
-  fixed glActiveTexture / glMatrixMode(GL_TEXTURE) bug (#669080)
-  glGet(GL_CURRENT_SECONDARY_COLOR) should return 4 values, not 3
-  fixed compilation problem on Solaris7/x86 (bug 536406)
-  fixed prefetch bug in 3DNow! code (Felix Kuhling)
-  fixed NeXT build problem (FABSF macro)
-  glDrawPixels Z values when glPixelZoom!=1 were invalid (bug 687811)
-  zoomed glDraw/CopyPixels with clipping sometimes failed (bug 689964)
-  AA line and triangle Z values are now rounded, not truncated
-  fixed color interpolation bug when GLchan==GLfloat (bug 694461)
-  glArePrograms/TexturesResident() wasn't 100% correct (Jose Fonseca)
-  fixed a minor GL_COLOR_MATERIAL bug
-  NV vertex program EXP instruction was broken
-  glColorMask misbehaved with X window / pixmap rendering
-  fix autoconf/libtool GLU C++ linker problem on Linux (a total hack)
-  attempt to fix GGI compilation problem when MesaDemos not present
-  NV vertex program ARL-relative fetches didn't work

Changes:

-  use glPolygonOffset in gloss demo to avoid z-fighting artifacts
-  updated winpos and pointblast demos to use ARB extensions
-  disable SPARC normal transformation code (bug 673938)
-  GLU fixes for OS/2 (Evgeny Kotsuba)

5.0.2 September 5, 2003
-----------------------

Bug fixes:

-  fixed texgen problem causing texcoord's Q to be zero (stex3d)
-  default GL_TEXTURE_COMPARE_MODE_ARB was wrong
-  GL_CURRENT_MATRIX_NV query was wrong
-  GL_CURRENT_MATRIX_STACK_DEPTH_NV query was off by one
-  GL_LIST_MODE query wasn't correct
-  GL_FOG_COORDINATE_SOURCE_EXT query wasn't supported
-  GL_SECONDARY_COLOR_ARRAY_SIZE_EXT query returned wrong value
-  blended, wide lines didn't always work correctly (bug 711595)
-  glVertexAttrib4svNV w component was always 1
-  fixed bug in GL_IBM_rasterpos_clip (missing return)
-  GL_DEPTH_TEXTURE_MODE = GL_ALPHA didn't work correctly
-  a few Solaris compilation fixes
-  fixed glClear() problem for DRI drivers (non-existant stencil, etc)
-  fixed int/REAL mixup in GLU NURBS curve evaluator (Eric Cazeaux)
-  fixed delete [] bug in SI GLU (bug 721765) (Diego Santa Cruz)
-  glFog() didn't clamp fog colors
-  fixed bad float/int conversion for GL_TEXTURE_PRIORITY in the
   gl[Get]TexParameteri[v] functions
-  fixed invalid memory references in glTexGen functions (bug 781602)
-  integer-valued color arrays weren't handled correctly
-  glDrawPixels(GL_DEPTH_COMPONENT) with glPixelZoom didn't work
-  GL_EXT_texture_lod_bias is part of 1.4, overlooked in 5.0.1

Changes:

-  build GLUT with -fexceptions so C++ apps propogate exceptions

5.1 December 17, 2003
---------------------

New:

-  reorganized directory tree
-  GL_ARB_vertex/fragment_program extensions (Michal Krol & Karl Rasche)
-  GL_ATI_texture_env_combine3 extension (Ian Romanick)
-  GL_SGI_texture_color_table extension (Eric Plante)
-  GL_NV_fragment_program extension
-  GL_NV_light_max_exponent extension
-  GL_EXT_texture_rectangle (identical to GL_NV_texture_rectangle)
-  GL_ARB_occlusion_query extension
-  GL_ARB_point_sprite extension
-  GL_ARB_texture_non_power_of_two extension
-  GL_IBM_multimode_draw_arrays extension
-  GL_EXT_texture_mirror_clamp extension (Ian Romanick)
-  GL_ARB_vertex_buffer_object extension
-  new X86 feature detection code (Petr Sebor)
-  less memory used for display lists and vertex buffers
-  demo of per-pixel lighting with a fragment program (demos/fplight.c)
-  new version (18) of glext.h header
-  new spriteblast.c demo of GL_ARB_point_sprite
-  faster glDrawPixels in X11 driver in some cases (see relnotes/5.1)
-  faster glCopyPixels in X11 driver in some cases (see relnotes/5.1)

Bug fixes:

-  really enable OpenGL 1.4 features in DOS driver.
-  fixed issues in glDrawPixels and glCopyPixels for very wide images
-  glPixelMapf/ui/usv()'s size parameter is GLsizei, not GLint
-  fixed some texgen bugs reported by Daniel Borca
-  fixed wglMakeCurrent(NULL, NULL) bug (#835861)
-  fixed glTexSubImage3D z-offset bug (Cedric Gautier)
-  fixed RGBA blend enable bug (Ville Syrjala)
-  glAccum is supposed to be a no-op in selection/feedback mode
-  fixed texgen bug #597589 (John Popplewell)

Changes:

-  dropped API trace feature (src/Trace/)
-  documentation overhaul. merged with website content. more html.
-  glxgears.c demo updated to use GLX swap rate extensions
-  glTexImage1/2/3D now allows width/height/depth = 0
-  disable SPARC asm code on Linux (bug 852204)

6.0 January 16, 2004
--------------------

New:

-  full OpenGL 1.5 support
-  updated GL/glext.h file to version 21 Changes:
-  changed max framebuffer size to 4Kx4K (MAX_WIDTH/HEIGHT in config.h)
   Bug fixes:
-  fixed bug in UNCLAMPED_FLOAT_TO_UBYTE macro; solves a color clamping
   issue
-  updated suno5-gcc configs
-  glColor3 functions sometimes resulted in undefined alpha values
-  fixed FP divide by zero error seen on VMS with xlockmore, others
-  fixed vertex/fragment program debug problem (bug 873011)
-  building on AIX with gcc works now
-  glDeleteProgramsARB failed for ARB fragment programs (bug 876160)
-  glDrawRangeElements tried to modify potentially read-only storage
-  updated files for building on Windows

6.0.1 April 2, 2004
-------------------

New:

-  upgraded glext.h to version 22
-  new build targets (Dan Schikore)
-  new linux-x86-opteron build target (Heath Feather)

Bug fixes:

-  glBindProgramARB didn't update all necessary state
-  fixed build problems on OpenBSD
-  omit CVS directories from tarballs
-  glGetTexImage(GL_COLOR_INDEX) was broken
-  fixed an infinite loop in t&l module
-  silenced some valgrind warnings about using unitialized memory
-  fixed some compilation/link glitches on IRIX (Mike Stephens)
-  glBindProgram wasn't getting compiled into display lists
-  GLX_FBCONFIG_ID wasn't recognized in glXChooseFBConfig() (bug 888079)
-  two-sided lighting and vertex program didn't work (bug 887330)
-  stores to program parameter registers in vertex state programs didn't
   work.
-  fixed glOrtho bug found with gcc 3.2.2 (RH9)
-  glXCreateWindow() wasn't fully implemented (bug 890894)
-  generic vertex attribute arrays didn't work in display lists
-  vertex buffer objects' default usage and access fields were wrong
-  glDrawArrays with start!=0 was broken
-  fragment program PK2H, UP2H, UP4B and UP4UB instructions were broken
-  linux-osmesa16-static config didn't work
-  fixed a few color index rendering problems (bug 910687)
-  glInterleavedArrays didn't respect GL_CLIENT_ACTIVE_TEXTURE
-  OSMesa RGB and BGR modes were broken
-  glProgramStringARB mistakenly required a null-terminated string
-  fragment program XPD instruction was incorrect
-  glGetMaterial() didn't work reliably
-  ARB_fragment_program KIL instruction was incorrect

6.1 August 18, 2004
-------------------

New:

-  Revamped Makefile system
-  glXUseRotatedXFont() utility (see xdemos/xuserotfont.c)
-  internal driver interface changes related to texture object
   allocation, vertex/fragment programs, BlendEquationSeparate, etc.
-  option to walk triangle edges with double-precision floats (Justin
   Novosad of Discreet) (see config.h file)
-  support for AUX buffers in software GLX driver
-  updated glext.h to version 24 and glxext.h to version 6
-  new MESA_GLX_FORCE_ALPHA and MESA_GLX_DEPTH_BITS env vars
-  updated BeOS support (Philippe Houdoin)

Changes:

-  fragment fog interpolation is perspective corrected now
-  new glTexImage code, much cleaner, may be a bit faster

Bug fixes:

-  glArrayElement in display lists didn't handle generic vertex attribs
-  glFogCoord didn't always work properly
-  ARB_fragment_program fog options didn't work
-  frag prog TEX instruction no longer incorrectly divides s,t,r by q
-  ARB frag prog TEX and TEXP instructions now use LOD=0
-  glTexEnviv in display lists didn't work
-  glRasterPos didn't do texgen or apply texture matrix
-  GL_DOUBLE-valued vertex arrays were broken in some cases
-  fixed texture rectangle edge/border sampling bugs
-  sampling an incomplete texture in a fragment program would segfault
-  glTexImage was missing a few error checks
-  fixed some minor glGetTexParameter glitches
-  GL_INTENSITY was mistakenly accepted as a <format> to glTexImage
-  fragment program writes to RC/HC register were broken
-  fixed a few glitches in GL_HP_occlusion_test extension
-  glBeginQueryARB and glEndQueryARB didn't work inside display lists
-  vertex program state references were broken
-  fixed triangle color interpolation bug on AIX (Shane Blackett)
-  fixed a number of minor memory leaks (bug #1002030)

6.2 October 2, 2004
-------------------

New:

-  enabled GL_ARB_texture_rectangle (same as GL_NV_texture_rectangle)
-  updated Doxygen support (Jose Fonseca)

Changes:

-  some GGI driver updates (Christoph Egger, bug 1025977)

Bug fixes:

-  Omit GL_ARB_texture_non_power_of_two from list of OpenGL 1.5 features
-  fixed a few compilation issues on IRIX
-  fixed a matrix classification bug (reported by Wes Bethel)
-  we weren't reseting the vertex/fragment program error state before
   parsing (Dave Reveman)
-  adjust texcoords for sampling texture rectangles (Dave Reveman)
-  glGet*(GL_MAX_VERTEX_ATTRIBS_ARB) wasn't implemented
-  repeated calls to glDeleteTexture(t) could lead to a crash
-  fixed potential ref count bugs in VBOs and vertex/fragment programs
-  spriteblast demo didn't handle window size changes correctly
-  glTexSubImage didn't handle pixels=NULL correctly for PBOs
-  fixed color index mode glDrawPixels bug (Karl Schultz)

6.2.1 December 9, 2004
----------------------

Bug fixes:

-  don't apply regular fog or color sum when using a fragment program
-  glProgramEnvParameter4fARB always generated an error on
   GL_FRAGMENT_PROGRAM_ARB (fdo bug 1645)
-  glVertexAttrib3svNV and glVertexAttrib3svARB were broken
-  fixed width/height mix-up in glSeparableFilter2D()
-  fixed regression in glCopyPixels + convolution
-  glReadPixels from a clipped front color buffer didn't always work
-  glTexImage didn't accept GL_RED/GREEN/BLUE as the format
-  Attempting queries/accesses of VBO 0 weren't detected as errors
-  paletted textures failed if the palette had fewer than 256 entries

Changes:

-  fixed a bunch of compiler warnings found with gcc 3.4
-  bug reports should to go bugzilla.freedesktop.org

6.3 July 20, 2005
-----------------

New:

-  GL_EXT_framebuffer_object extension
-  GL_ARB_draw_buffers extension
-  GL_ARB_pixel_buffer_object extension
-  GL_OES_read_format extension (Ian Romanick)
-  DirectFB driver (Claudio Ciccani)
-  x86_64 vertex transformation code (Mikko T.)
-  Updated GL/glext.h to version 29

Changes:

-  added -stereo option for glxgears demo (Jacek Rosik)
-  updated the PBuffer demo code in xdemos/ directory
-  glDeleteTextures/Programs/Buffers() now makes the object ID available
   for immediate re-use
-  assorted 64-bit clean-ups fixes (x86_64 and Win64)
-  lots of internal changes for GL_EXT_framebuffer_object

Bug fixes:

-  some functions didn't support PBO functionality
-  glGetTexImage didn't convert color index images to RGBA as required
-  fragment program texcoords were sometimes wrong for points and lines
-  fixed problem with negative dot product in arbfplight, fplight demos
-  fixed bug in perspective correction of antialiased, textured lines
-  querying GL_POST_CONVOLUTION_ALPHA_BIAS_EXT returned wrong value
-  fixed a couple per-pixel fog bugs (Soju Matsumoto)
-  glGetBooleanv(GL_FRAGMENT_PROGRAM_BINDING_NV) was broken
-  fixed float parsing bug in ARB frag/vert programs (bug 2520)
-  XMesaGetDepthBuffer() returned incorrect value for bytesPerValue
-  GL_COLOR_MATERIAL with glColor3 didn't properly set diffuse alpha
-  glXChooseFBConfig() crashed if attribList pointer was NULL
-  program state.light[n].spot.direction.w was wrong value (bug 3083)
-  fragment program fog option required glEnable(GL_FOG) - wrong.
-  glColorTable() could produce a Mesa implementation error (bug 3135)
-  RasterPos could get corrupted by color index rendering path
-  Removed bad XTranslateCoordinates call when rendering to Pixmaps
-  glPopAttrib() didn't properly restore GL_TEXTURE_GEN enable state
-  fixed a few Darwin compilation problems

6.3.1
-----

This was an intermediate release for X.org which wasn't otherwise
released.)

6.3.2 August 19, 2005
---------------------

New:

-  The distribution now includes the DRI drivers and GLX code

Changes:

-  Made the DRI "new" driver interface standard, remove old code

Bug fixes:

-  GL_ARB_vertex/fragment_shader were mistakenly listed in the
   extensions string
-  negative relative addressing in vertex programs was broken
-  update/fix SPARC assembly code for vertex transformation
-  fixed memory leak when freeing GLX drawables/renderbuffers
-  fixed display list memory leak
-  the GL_PIXEL_MAP_I_TO_I table is now floating point, not integer
-  wglGetProcAddress() didn't handle wgl-functions
-  fixed glxext.h cross-compile issue (Colin Harrison)
-  assorted DRI driver fixes

.. note::

   Changes for Mesa 6.4 and later are documented in the corresponding
   :doc:`release notes <relnotes>` file.
