


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 noticably
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.  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.

