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:
An initialisation function is called from the DIX layer for each screen at the start of each server generation.
The server takes control of the console.
The server releases control of the console.
Change video mode.
Change the origin of the physical view port.
Screen saver activation/deactivation.
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:
Print a driver identifying message.
This is how a driver identifies if there is any hardware present that it knows how to drive.
Process information from the xorg.conf file, determine the full characteristics of the hardware, and determine if a valid configuration is present.
The VidMode extension also requires:
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.