English/Français
Introduction
Un contexte matériel représente l'état de la carte, notamment les registres du GPU et la FIFO de commande. Le lecteur intéressé lira cet article wikipedia (en anglais) : http://en.wikipedia.org/wiki/Context_switch, qui explique la notion de contexte matériel et le changement de contexte, dans le cas d'un microprocesseur. Le cas du GPU ne diffère pas conceptuellement.
Context switching : pourquoi ?
La finalité du changement de contexte est de permettre à plusieurs clients d'accéder à la carte en même temps, sans qu'il n'y ait d'interférences au niveau matériel. Ces clients seront, typiquement, le serveur X et des applications OpenGL. En effet, le driver 2D utilise un contexte matériel, et chaque client OpenGL en prend un de plus.
Cela signifie que faire tourner même une simple application OpenGL nécessite d'avoir des changements de contexte fonctionnels, parce qu'il y a aura deux contextes matériels (un pour X, l'autre pour l'application GL). (en fait, darktama a réussi à faire tourner une appli GL en plus de X, sans changement de contexte, mais avec des restrictions - voir les vieux TiNDC).
Les cartes NVidia disposent de plusieurs canaux de commande, chacun d'eux étant associé à un contexte matériel donné. Cela signifie que, tant qu'il y a des contextes matériels disponibles, chaque client graphique aura son propre canal de commande et son propre contexte sur la carte.
Context switching : comment ?
L'échange entre deux contextes n'est pas fait de la même façon sur toutes les cartes. Les cartes NVidia les plus récentes le font automatiquement, mais ont besoin d'une initialisation particulière, alors que les anciennes ont besoin que le driver s'en occupe.
Jusqu'au NV10, les changements de contexte sont fait par le driver, et son liés à des interruptions : lorsque la carte reçoit une commande sur un canal qui n'est pas actif, elle envoie une interruption PGRAPH (interruption du moteur graphique) au driver, qui va devoir sauvegarder les registres, et restaurer ceux du nouveau contexte.
À partir du NV20, les changements de contexte sont fait en hardware par le GPU, et à partir du NV40, les cartes ont besoin d'un microcode spécial, appelé ctxprogs.
Le changement de contexte marche maintenant pour toutes les cartes. Pour les cartes qui ont besoin du microcode (NV4x+), un générateur de ctxprogs est maintenant fonctionnel. L'ancienne solution était de copier le microcode envoyé par le driver propriétaire.
Le 'How To' pour les cartes utilisant ctxprogs est ici : http://nouveau.freedesktop.org/wiki/CtxInit
Quoi d'autre ?
Nous pourrions en théorie nous en sortir avec un seul contexte matériel, en faisant en sorte que le driver s'occupe de tout (conceptuellement, cela signifie que nous implémenterions les changements de contexte en software). Cependant, cette approche a été refusée par marcheu et airlied qui la trouvent inefficace (voir les arguments techniques dans les anciens TiNDC).
Ce texte vaut également la peine d'être lu. (Notez que les NV1 utilisaient des FIFO MMIO, alors que les cartes NV4 et plus utilisent des FIFO DMA.)