To reduce display driver size, it is desirable to implement only those functions that the display driver can do faster than GDI and have GDI perform all other operations. It is common to have GDI do much of the drawing to linear frame buffers to reduce the size of the driver. However, GDI cannot directly access banked memory. Therefore, when the frame buffer is not linearly addressable, the display driver must divide the frame buffer into a series of banks and provide a means for GDI to perform its draw operations to the appropriate bank. See Supporting Banked Frame Buffers for details.
The display driver has direct access to I/O- and memory-mapped video registers. This access allows a display driver to achieve high performance. For example, the driver might need to access video hardware registers to send line-drawing commands at high throughput.
Similarly, for video cards, such as the S3, many of the innermost loops in the graphics engine code require reads and writes of several video controller ports (for example, text output in graphics mode, bit block transfers, and line drawing). The performance in these cases would be unacceptable if the display driver were required to send an IOCTL to the miniport driver for each request, so the display driver is granted direct access to the video hardware. This access is granted by the miniport and video port drivers.