


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

This document describes the implementation of the XFree86 4.0 libGL.so
library defined by the Linux/OpenGL Base specification found at
http://reality.sgi.com/opengl/linux/linuxbase.html.

The documentation is divided into two sections:
    User's Guide
    Driver Developer's Guide

Author:  Brian Paul     (brian@precisioninsight.com)
Date:    February 2000



User's Guide
------------

Using libGL.so

The libGL.so library defines the gl- and glX-prefixed functions needed to
run OpenGL programs.  OpenGL client applications should link with the
-lGL option to use it.

libGL.so serves two primary functions: GLX protocol generation for indirect
rendering and loading/management of hardware drivers for direct rendering.

When libGL.so initializes itself it uses the DRI to determine the
appropriate hardware driver for each screen on the local X display.
The hardware drivers are expected to be in the /usr/X11R6/lib/modules/dri/
directory.  Drivers are named with the convention <name>_dri.so where
<name> is a driver such as "radeon", "i965", "nouveau", etc.

The LIBGL_DRIVERS_DIR environment variable may be used to specify a
different DRI modules directory, overriding /usr/X11R6/lib/modules/dri/.
This environment variable is ignored in setuid programs for security
reasons.

When libGL.so is unable to locate appropriate hardware drivers it will
fall back to using indirect GLX rendering.

To aid in solving problems, libGL.so will print diagnostic messages to
stderr if the LIBGL_DEBUG environment variable is defined.

libGL.so is thread safe.  The overhead of thread safety for common,
single-thread clients is negligible.  However, the overhead of thread
safety for multi-threaded clients is significant.  Each GL API call
requires two calls to pthread_get_specific() which can noticeably
impact performance.  Warning:  libGL.so is thread safe but individual
DRI drivers may not be.  Please consult the documentation for a driver
to learn if it is thread safe.



Indirect Rendering

You can force indirect rendering mode by setting the LIBGL_ALWAYS_INDIRECT
environment variable to `true`.  Hardware acceleration will not be used.



libGL.so Extensibility

libGL.so is designed to be extended without upgrading.  That is,
drivers may install new OpenGL extension functions into libGL.so
without requiring libGL.so to be replaced.  Clients of libGL.so should
use the glXGetProcAddressEXT() function to obtain the address of
functions by name.  For more details of GLX_ARB_get_proc_address see
http://oss.sgi.com/projects/ogl-sample/registry/ARB/get_proc_address.spec

libGL.so is also designed with flexibility such that it may be used
with many generations of hardware drivers to come.




Driver Developer's Guide
------------------------

This section describes the requirements to make an XFree86 4.0
libGL.so-compatible hardware driver.  It is not intended for end
users of libGL.so.


XFree86 source files

libGL.so is built inside XFree86 with sources found in xc/lib/GL/.
Specifically, libGL.so is built from:

	xc/lib/GL/glx/*.c
	xc/lib/dri/XF86dri.c
	xc/lib/dri/dri_glx.c
	xc/lib/GL/mesa/src/glapi.c
	xc/lib/GL/mesa/src/glapitemp.h
	xc/lib/GL/mesa/src/glapitable.h
	xc/lib/GL/mesa/src/glapioffsets.h
	xc/lib/GL/mesa/src/glapinoop.c
	xc/lib/GL/mesa/src/glheader.h
	xc/lib/GL/mesa/src/glthread.c
	xc/lib/GL/mesa/src/glthread.h
	xc/lib/GL/mesa/src/X86/glapi_x86.S
	xc/lib/GL/mesa/src/X86/assyntax.h

Understand that the mesa/src/gl*.[ch] files are not tied to Mesa.  They
have no dependencies on the rest of Mesa and are designed to be reusable
in a number of projects.

The glapi_x86.X and assyntax.h files implement x86-optimized dispatch
of GL functions.  They are not required; C-based dispatch can be used
instead, with a slight performance penalty.



Driver loading and binding

When libGL.so initializes itself (via the __glXInitialize function) a
call is made to driCreateDisplay().  This function uses DRI facilities
to determine the driver file appropriate for each screen on the local
display.  Each screen's driver is then opened with dlopen() and asked
for its __driCreateScreen() function.  The pointers to the __driCreateScreen()
functions are kept in an array, indexed by screen number, in the
__DRIdisplayRec struct.

When a driver's __driCreateScreen() function is called, it must initialize
a __DRIscreenRec struct.  This struct acts as the root of a tree of
function pointers which are called to create and destroy contexts and
drawables and perform all the operations needed by the GLX interface.
See the xc/lib/GL/glx/glxclient.h file for details.



Dynamic Extension Function Registration

In order to provide forward compatibility with future drivers, libGL.so
allows drivers to register new OpenGL extension functions which weren't
known when libGL.so was built.

The register_extensions() function in xc/lib/GL/dri/dri_glx.c is called
as soon as libGL.so is loaded.  This is done with gcc's constructor
attribute.  This mechanism will likely have to be changed for other compilers.

register_extensions() loops over all local displays and screens, determines
the DRI driver for each, and calls the driver's __driRegisterExtensions()
function, if present.

The __driRegisterExtensions() function can add new entrypoints to libGL
by calling:

    GLboolean _glapi_add_entrypoint(const char *funcName, GLuint offset)

The parameters are the name of the function (such as "glFoobarEXT") and the
offset of the dispatch slot in the API dispatch table.  The return value
indicates success (GL_TRUE) or failure (GL_FALSE).

_glapi_add_entrypoint() will synthesize entrypoint code in assembly
language.  Assembly languages is required since parameter passing
can't be handled correctly using a C-based solution.

The address of the new entrypoint is obtained by calling the
glXGetProcAddressARB() function.

The dispatch offset number MUST be a number allocated by SGI in the same
manner in which new GL_* constants are allocated.  Using an arbitrary
offset number will result in many problems.



Dispatch Management

When a GL context is made current, the driver must install its dispatch
table as the current dispatch table.  This is done by calling

	void _glapi_set_dispatch(struct _glapi_table *dispatch);

This will install the named dispatch table for the calling thread.
The current dispatch table for a thread can be obtained by calling

	struct _glapi_table *_glapi_get_dispatch(void);

For higher performance in the common single-thread case, the global
variable _glapi_Dispatch will point to the current dispatch table.
This variable will be NULL when in multi-thread mode.



Context Management

libGL.so uses the XFree86 xthreads package to manage a thread-specific
current context pointer.  See __glXGet/SetCurrentContext() in glext.c

Drivers may use the _glapi_set/get_context() functions to maintain
a private thread-specific context pointer.

