Treiber dienen immer dazu, Geräte voneinander zu entkoppeln. Wenn Daten von A nach B übertragen werden sollen (Programm -> Drucker, Joystick -> Programm, Programm -> Graphikkarte) dann ist es viel einfacher, einen Treiber zu verwenden, der dazwischen steht:
A -> T -> B
Wenn es nämlich viele Geräte A1...An und viele Geräte B1...Bn gibt dann ist es viel einfacher
A1 -> T
A2 -> T
...
An -> T
und
T -> B1
T -> B2
...
T -> Bn
zu programmieren als
A1 -> B1, A1 -> B2, ... A1 -> Bn
A2 -> B1, A2 -> B2, ... A2 -> Bn
...
An -> B1, An -> B2, ... An -> Bn
Vielleicht können sich einige von euch noch an DOS, Atari ST, Amiga-Zeiten erinnern (von C64, CBM 8032, TSR-80, PET 2001 ganz zu schweigen

). Dort hat de facto jedes Programm eigene Druckertreiber gehabt. Man musste sowohl in WordPerfect als auch in Lotus 1-2-3 den angeschlossenen Drucker installieren.
Für Programmierer ist es natürlich bei weitem einfacher, wenn man eine Seite des Dokuments an den Treiber schicken kann und der kümmert sich dann darum, wie sich die Papierqualität auswirkt oder ob der Drucker PostScript kann usw.
Genauso bei der Graphikkarte. Der Programmierer möchte einen Kreis zeichnen. Ob der Kreis vom Treiber als Polygonzug mit Sinus und Cosinus gezeichnet wird oder ob in der Karte das Primitiv "Kreis" vorhanden ist, fällt nicht mehr auf (außer in der Zeichengeschwindigkeit).
Und ob an einem Input-Gerät, das die Befehle "links, rechts, oben, unten" liefert ein Joystick, Gamepad, Tastatur oder VR-Anzug mit Raum-Tracker angeschlossen ist, ist belanglos.
Alex