3. Driver Interface

The driver interface consists of a minimal set of entry points that are
required based on the external events that the driver must react to.
No non-essential structure is imposed on the way they are used beyond
that. This is a significant difference compared with the old design.

The entry points for drawing operations are already taken care of by
the framebuffer code (including, XAA). Extensions and enhancements to
framebuffer code are outside the scope of this document.

This approach to the driver interface provides good flexibility, but does
increase the complexity of drivers. To help address this, the XFree86
common layer provides a set of ``helper'' functions to take care of things
that most drivers need. These helpers help minimise the amount of code
duplication between drivers. The use of helper functions by drivers is
however optional, though encouraged. The basic philosophy behind the
helper functions is that they should be useful to many drivers, that
they should balance this against the complexity of their interface. It
is inevitable that some drivers may find some helpers unsuitable and
need to provide their own code.

Events that a driver needs to react to are:

ScreenInit

An initialisation function is called from the DIX layer for each
screen at the start of each server generation.

Enter VT

The server takes control of the console.

Leave VT

The server releases control of the console.

Mode Switch

Change video mode.

ViewPort change

Change the origin of the physical view port.

ScreenSaver state change

Screen saver activation/deactivation.

CloseScreen

A close screen function is called from the DIX layer for each screen
at the end of each server generation.

In addition to these events, the following functions are required by
the XFree86 common layer:

Identify

Print a driver identifying message.

Probe

This is how a driver identifies if there is any hardware present that
it knows how to drive.

PreInit

Process information from the XF86Config file, determine the
full characteristics of the hardware, and determine if a valid
configuration is present.

The VidMode extension also requires:

ValidMode

Identify if a new mode is usable with the current configuration.
The PreInit function (and/or helpers it calls) may also make use
of the ValidMode function or something similar.

Other extensions may require other entry points. The drivers will
inform the common layer of these in such cases.