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 clipping
-  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 consistently
-  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 software 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.
