| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275 | 
							- <HTML>
 - 
 - <TITLE>Xlib Software Driver</TITLE>
 - 
 - <link rel="stylesheet" type="text/css" href="mesa.css"></head>
 - 
 - <BODY>
 - 
 - <H1>Xlib Software Driver</H1>
 - 
 - <p>
 - Mesa's Xlib driver provides an emulation of the GLX interface so that
 - OpenGL programs which use the GLX API can render to any X display, even
 - those that don't support the GLX extension.
 - Effectively, the Xlib driver converts all OpenGL rendering into Xlib calls.
 - </p>
 - 
 - <p>
 - The Xlib driver is the oldest Mesa driver and the most mature of Mesa's
 - software-only drivers.
 - </p>
 - 
 - <p>
 - Since the Xlib driver <em>emulates</em> the GLX extension, it's not
 - totally conformant with a true GLX implementation.
 - The differences are fairly obscure, however.
 - </p>
 - 
 - <p>
 - The unique features of the Xlib driver follows.
 - </p>
 - 
 - 
 - <H2>X Visual Selection</H2>
 - <p>
 - Mesa supports RGB(A) rendering into almost any X visual type and depth.
 - </p>
 - <p>
 - The glXChooseVisual function tries to choose the best X visual
 - for the given attribute list.  However, if this doesn't suit your needs
 - you can force Mesa to use any X visual you want (any supported by your
 - X server that is) by setting the <b>MESA_RGB_VISUAL</b> and
 - <b>MESA_CI_VISUAL</b>
 - environment variables.
 - When an RGB visual is requested, glXChooseVisual
 - will first look if the MESA_RGB_VISUAL variable is defined.
 - If so, it will try to use the specified visual.
 - Similarly, when a color index visual is requested, glXChooseVisual will
 - look for the MESA_CI_VISUAL variable.
 - </p>
 - 
 - <p>
 - The format of accepted values is:  <code>visual-class depth</code>
 - </p>
 - <p>
 - Here are some examples:
 - </p>
 - <pre>
 -    using csh:
 - 	% setenv MESA_RGB_VISUAL "TrueColor 8"		// 8-bit TrueColor
 - 	% setenv MESA_CI_VISUAL "PseudoColor 12"	// 12-bit PseudoColor
 - 	% setenv MESA_RGB_VISUAL "PseudoColor 8"	// 8-bit PseudoColor
 - 
 -    using bash:
 - 	$ export MESA_RGB_VISUAL="TrueColor 8"
 - 	$ export MESA_CI_VISUAL="PseudoColor 12"
 - 	$ export MESA_RGB_VISUAL="PseudoColor 8"
 - </pre>
 - 
 - 
 - <H2>Double Buffering</H2>
 - <p>
 - Mesa can use either an X Pixmap or XImage as the back color buffer when in
 - double-buffer mode.
 - The default is to use an XImage.
 - The <b>MESA_BACK_BUFFER</b> environment variable can override this.
 - The valid values for <b>MESA_BACK_BUFFER</b> are:  <b>Pixmap</b> and
 - <b>XImage</b> (only the first letter is checked, case doesn't matter).
 - </p>
 - 
 - <p>
 - Using XImage is almost always faster than a Pixmap since it resides in
 - the application's address space.
 - When glXSwapBuffers() is called, XPutImage() or XShmPutImage() is used
 - to transfer the XImage to the on-screen window.
 - </p>
 - <p>
 - A Pixmap may be faster when doing remote rendering of a simple scene.
 - Some OpenGL features will be very slow with a Pixmap (for example, blending
 - will require a round-trip message for pixel readback.)
 - </p>
 - <p>
 - Experiment with the MESA_BACK_BUFFER variable to see which is faster
 - for your application.
 - </p>
 - 
 - 
 - <H2>Colormaps</H2>
 - <p>
 - When using Mesa directly or with GLX, it's up to the application
 - writer to create a window with an appropriate colormap.  The GLUT
 - toolkit tris to minimize colormap <em>flashing</em> by sharing
 - colormaps when possible.  Specifically, if the visual and depth of the
 - window matches that of the root window, the root window's colormap
 - will be shared by the Mesa window.  Otherwise, a new, private colormap
 - will be allocated.
 - </p>
 - 
 - <p>
 - When sharing the root colormap, Mesa may be unable to allocate the colors
 - it needs, resulting in poor color quality.  This can happen when a
 - large number of colorcells in the root colormap are already allocated.
 - To prevent colormap sharing in GLUT, set the 
 - <b>MESA_PRIVATE_CMAP</b> environment variable.  The value isn't
 - significant.
 - </p>
 - 
 - 
 - <H2>Gamma Correction</H2>
 - <p>
 - To compensate for the nonlinear relationship between pixel values
 - and displayed intensities, there is a gamma correction feature in
 - Mesa.  Some systems, such as Silicon Graphics, support gamma
 - correction in hardware (man gamma) so you won't need to use Mesa's
 - gamma facility.  Other systems, however, may need gamma adjustment
 - to produce images which look correct.  If you believe that 
 - Mesa's images are too dim, read on.
 - </p>
 - 
 - <p>
 - Gamma correction is controlled with the <b>MESA_GAMMA</b> environment
 - variable.  Its value is of the form <b>Gr Gg Gb</b> or just <b>G</b> where
 - Gr is the red gamma value, Gg is the green gamma value, Gb is the
 - blue gamma value and G is one gamma value to use for all three
 - channels.  Each value is a positive real number typically in the
 - range 1.0 to 2.5.
 - The defaults are all 1.0, effectively disabling gamma correction.
 - Examples:
 - </p>
 - <pre>
 - 	% export MESA_GAMMA="2.3 2.2 2.4"	// separate R,G,B values
 - 	% export MESA_GAMMA="2.0"		// same gamma for R,G,B
 - </pre>
 - <p>
 - The progs/demos/gamma.c program may help you to determine reasonable gamma
 - value for your display.  With correct gamma values, the color intensities
 - displayed in the top row (drawn by dithering) should nearly match those
 - in the bottom row (drawn as grays).
 - </p>
 - 
 - <p>
 - Alex De Bruyn reports that gamma values of 1.6, 1.6 and 1.9 work well
 - on HP displays using the HP-ColorRecovery technology.
 - </p>
 - 
 - <p>
 - Mesa implements gamma correction with a lookup table which translates
 - a "linear" pixel value to a gamma-corrected pixel value.  There is a
 - small performance penalty.  Gamma correction only works in RGB mode.
 - Also be aware that pixel values read back from the frame buffer will
 - not be "un-corrected" so glReadPixels may not return the same data
 - drawn with glDrawPixels.
 - </p>
 - 
 - <p>
 - For more information about gamma correction see:
 - <a href="http://www.inforamp.net/~poynton/notes/colour_and_gamma/GammaFAQ.html"
 - the Gamma FAQ</a>
 - </p>
 - 
 - 
 - <H2>Overlay Planes</H2>
 - <p>
 - Hardware overlay planes are supported by the Xlib driver.  To
 - determine if your X server has overlay support you can test for the
 - SERVER_OVERLAY_VISUALS property:
 - </p>
 - <pre>
 - 	xprop -root | grep SERVER_OVERLAY_VISUALS
 - </pre>
 - 
 - 
 - <H2>HPCR Dithering</H2>
 - <p>
 - If you set the <b>MESA_HPCR_CLEAR</b> environment variable then dithering
 - will be used when clearing the color buffer.  This is only applicable
 - to HP systems with the HPCR (Color Recovery) feature.
 - This incurs a small performance penalty.
 - </p>
 - 
 - 
 - <H2>Extensions</H2>
 - <p>
 - The following MESA-specific extensions are implemented in the Xlib driver.
 - </p>
 - 
 - <h3>GLX_MESA_pixmap_colormap</h3>
 - 
 - <p>
 - This extension adds the GLX function:
 - </p>
 - <pre>
 -     GLXPixmap glXCreateGLXPixmapMESA( Display *dpy, XVisualInfo *visual,
 -                                       Pixmap pixmap, Colormap cmap )
 - </pre>
 - <p>
 - It is an alternative to the standard glXCreateGLXPixmap() function.
 - Since Mesa supports RGB rendering into any X visual, not just True-
 - Color or DirectColor, Mesa needs colormap information to convert RGB
 - values into pixel values.  An X window carries this information but a
 - pixmap does not.  This function associates a colormap to a GLX pixmap.
 - See the xdemos/glxpixmap.c file for an example of how to use this
 - extension.
 - </p>
 - <p>
 - <a href="MESA_pixmap_colormap.spec">GLX_MESA_pixmap_colormap specification</a>
 - </p>
 - 
 - 
 - <h3>GLX_MESA_release_buffers</h3>
 - <p>
 - Mesa associates a set of ancillary (depth, accumulation, stencil and
 - alpha) buffers with each X window it draws into.  These ancillary
 - buffers are allocated for each X window the first time the X window
 - is passed to glXMakeCurrent().  Mesa, however, can't detect when an
 - X window has been destroyed in order to free the ancillary buffers.
 - </p>
 - <p>
 - The best it can do is to check for recently destroyed windows whenever
 - the client calls the glXCreateContext() or glXDestroyContext()
 - functions.  This may not be sufficient in all situations though.
 - </p>
 - <p>
 - The GLX_MESA_release_buffers extension allows a client to explicitly
 - deallocate the ancillary buffers by calling glxReleaseBuffersMESA()
 - just before an X window is destroyed.  For example:
 - </p>
 - <pre>
 -          #ifdef GLX_MESA_release_buffers
 -             glXReleaseBuffersMESA( dpy, window );
 -          #endif
 -          XDestroyWindow( dpy, window );
 - </pre>
 - <p>
 - <a href="MESA_release_buffers.spec">GLX_MESA_release_buffers specification</a>
 - </p>
 - <p>
 - This extension was added in Mesa 2.0.
 - </p>
 - 
 - <H3>GLX_MESA_copy_sub_buffer</H3>
 - <p>
 - This extension adds the glXCopySubBufferMESA() function.  It works
 - like glXSwapBuffers() but only copies a sub-region of the window
 - instead of the whole window.
 - </p>
 - <p>
 - <a href="MESA_copy_sub_buffer.spec">GLX_MESA_copy_sub_buffer specification</a>
 - </p>
 - <p>
 - This extension was added in Mesa 2.6
 - </p>
 - 
 - <h2>Summary of X-related environment variables</H2>
 - <pre>
 -    MESA_RGB_VISUAL - specifies the X visual and depth for RGB mode (X only)
 -    MESA_CI_VISUAL - specifies the X visual and depth for CI mode (X only)
 -    MESA_BACK_BUFFER - specifies how to implement the back color buffer (X only)
 -    MESA_PRIVATE_CMAP - force aux/tk libraries to use private colormaps (X only)
 -    MESA_GAMMA - gamma correction coefficients (X only)
 - </pre>
 - 
 - 
 - </body>
 - </html>
 
 
  |