La pile graphique

Jérôme Pouiller Programme

Rappels sur les OS Historique du protocole X (la préhistoire) Accélération 2D Accélération des vidéos Accélération 3D des clients Drivers graphiques 3D Accélération du bureau toolkits graphiques

Sysmic - J. Pouiller La pile graphique Linux 2 / 29 Rappel sur la mémoire

Les CPU modernes intègrent un composant appelé MMU (Memory Management Unit): Unité de translation d’adresses mémoire On parle d’adresses physiques et virtuelles Lorsque le MMU est actif (cas nominal), toutes les adresses du code assembleur sont des adresses virtuelles Il est possible de configurer le MMU avec une instruction spéciale et en lui donnant un pointeur sur un tableau (dans la pratique, il s’agit plutôt d’un arbre) associant les adresses physiques et les adresses virtuelles

Sysmic - J. Pouiller La pile graphique Linux 3 / 29 Drivers en espace utilisateur

mmap permet d’allouer des plage d’adresses virtuelles Elles sont associées à : Mémoire anonyme (= allocation de mémoire) Fichiers (en intégralité ou en partie) /dev/mem représente la mémoire physique Utiliser mmap avec /dev/mem revient à accéder directement aux adresses physiques Avec iopl et ioperm, il est possible à un programme utilisateur d’accéder au ioport (inb, outb, ...) XFree86 est basé sur ce modèle

Sysmic - J. Pouiller La pile graphique Linux 4 / 29 Fonctionnement de XFree86

Permet d’être portable entre les différents OS X gère aussi l’accès partagé aux périphériques d’entrées (souris, clavier, ’ecran tactile) ’est normalement le rôle de l’OS de gérer les accès aux périphériques Accéder directement aux périphériques peut rentrer en conflit avec la gestion de l’OS (plantage) Au fur et a mesure du temps, on a porté des morceaux des pilotes de X dans le noyau : Au lieu de travailler sur /dev/mem, on travaille sur /dev/nvidia.

Sysmic - J. Pouiller La pile graphique Linux 5 / 29 Glossaire

X11R6.X, X11R7.X : Xserver + + applications X + documentation Xserver : Le serveur en lui même. Il est divisé en deux parties : DDX : Device Dependent X : Xfree86/Xorg, Xnest, KDrive/TinyX, XWin, Darwin, xvfb, , etc... un DDX peut avoir plusieurs drivers. chaque driver peut generer une binaire ou un module. Parfois, on nomme "Xserver" la partie DDX. DIX : Device Independent X : Le reste : gestion des protocoles clients, gestion des entrées, etc... Xorg : Fork de XFree86 pour des raison de licence (Xfree86 4.4, 2003) XAA : Différentes API interne à Xorg-Xserver pour travailler avec des drivers noyau et offrir un peu d’accélération (XFree86 3.3, 1997)

Sysmic - J. Pouiller La pile graphique Linux 6 / 29 Coté utilisateur

Sysmic - J. Pouiller La pile graphique Linux 7 / 29 Coté utilisateur

Protocole X : Protocole de haut niveau Lent

Sysmic - J. Pouiller La pile graphique Linux 8 / 29 Accélération 2D

L’accélération 2D est toujours basé sur le même principe : Donner un buffer de mémoire au client sur lequel il peut écrire directement (un framebuffer). Le buffer est copié vers la carte graphique par DMA. Il est possible de demander à la carte graphique d’altérer différents buffers : positionnement sur l’écran, duplication, composition, etc... /dev/fb : Framebuffer fourni par le noyau. Peut-être implémenté par divers drivers Xrender : Extension du protocole X pour permettre l’accès direct a des framebuffer (Xfree86 4.0, 2000) EXA/UXA/SNA : Amélioration de XAA pour permettre une meilleure intégration de Xrender KAA : Idem EXA mais pour KDrive/tinyX

Sysmic - J. Pouiller La pile graphique Linux 9 / 29 Le framebuffer noyau

/dev/fb : L’interface framebuffer fournie par le noyau. Il existe un driver Xserver-XFree86 s’appuyant sur /dev/fb Directfb : Bibliothèque fournissant une abstraction entre /dev/fb et les différentes entrées. Le framebuffer ne peut être utilisé que par une appliction à la fois. Le patch noyau linux-fusion ajoute le support multi-application au framebuffer. Il faut utiliser DirectFB-fusion pour en profiter. Les toolkits courants ont un backend DirectFB ou /dev/fb. Certain driver peuvent ajouter des extensions plus ou moins documentées à /dev/fb

Sysmic - J. Pouiller La pile graphique Linux 10 / 29 Accélération 2D/Video

Les vidéos peuvent être optimisée d’une manière particulière. Il est possible de remplir une série de buffer et de demander à la carte graphique de passer automatiquement d’un buffer à l’autre. Xv : Extension permettant cette optimisation Aussi basé sur XAA/EXA Généralement, si Xrender est présent, Xv l’est aussi.

Sysmic - J. Pouiller La pile graphique Linux 11 / 29 Accélération du décodage video

XvMC/XvBA/VDPAU/VA-API : Extension permettant d’effectuer une partie du décodage de la vidéo sur la carte graphique. VA-API s’est imposé. Les bibliothèque de lecture courrant utilise normalement ces extensions : mplayer, gstreamer, etc... Dans l’embarqué, certains drivers ne respectent pas ces API. Les fournisseurs de chipsets proposent alors des versions patchées de mplayer/gstreamer (ou parfois des players maison). Se méfier.

Sysmic - J. Pouiller La pile graphique Linux 12 / 29 Autres extensions X

Gestion physique des écrans : xrandr Gestion du clavier : xkbd Gestion multi-écrans : Gestion multi-pointeurs : MPX Gestion de fenêtres non carrées : xshape Gestion du curseur : xcursor Gestion des périphériques d’entrée modernes : xi (Input eXtention) Accès exclusif à l’écran (pour les jeux) : DGA Et d’autres : xdmcp, xprint, xft (fonts), xaccess, etc...

Sysmic - J. Pouiller La pile graphique Linux 13 / 29 Accélération 3D

SGI/Khronos a spécifié plusieurs API pour communiquer avec les cartes graphiques : OpenGL (1 à 4), GLU, OpenGLESv1, OpenGLESv2, OpenCL, OpenVG, .... SGI/Khronos a interdit à la communauté de réutiliser le nom OpenGL dans l’implémentation. L’implémentation s’appelle donc Mesa3D (contient libGL, libEGL, libGLES) Afin d’ouvrir une fenêtre OpenGL, il est nécessaire de s’interfacer avec X : : extension de X wgl : API MS Windows équivalente à glx EGL : Api normalisée par SGI/Khronos (afin d’éviter de refaire l’erreur de glx/wgl). Portable : Xorg, Windows, /dev/fb, DirectFB... Fonctionne avec GLES, OpenVG

Sysmic - J. Pouiller La pile graphique Linux 14 / 29 Accélération 3D

Mesa3D a besoin de s’interfacer avec le hardware. Il doit partager des ressources avec le serveur X. s’intègre par l’intermédiaire d’une interface interne appelé DRI (Direct Rendering Infrastructure). Le DRI s’appuie ensuite généralement sur un driver se trouvant dans le noyau. Ces drivers implémentent l’interface DRM () Mesa3D fourni un moteur software capable de fournir les fonctions OpenGL non implémentées par le Hardware.

Sysmic - J. Pouiller La pile graphique Linux 15 / 29 Accélélration 3D

Sysmic - J. Pouiller La pile graphique Linux 16 / 29 Accélération 3D

Afin de gérer les différents drivers et les différentes API, Mesa3D se repose sur une architecture appelée Gallium3D :

Sysmic - J. Pouiller La pile graphique Linux 17 / 29 Accélération 3D

Sur framebuffer : Sur /dev/fb, l’API ne permet pas d’accéder à OpenGL (pas de GLX). Certains drivers propriétaires permettent d’avoir un accès à EGL en utilisant des extensions non standards DirectFB propose des API pour accéder à OpenGL/EGL ... fortement dépendentes du driver ... s’appuie sur les DRM (EGL uniquement) Travail récent

Sysmic - J. Pouiller La pile graphique Linux 18 / 29 Drivers propriétaire

Un driver propriétaire doit fournir : Une implémentation de libGL, libGLES, etc... Du coup, il remplace Mesa3D Un driver Xserver et en particulier pour Xrender Un driver pour la 2D (/dev/fb) Un DRI pour Xorg-Xserver. Toutefois, le driver peut ne pas garder la notion de DRI dans son architecture Un driver pour la 3D (DRM). Notons que l’interface DRM n’est utilisé que par le DRI. Du coup, les constructeurs se permettent de ne pas respecter les interfaces standards sur ces deux composants.

Sysmic - J. Pouiller La pile graphique Linux 19 / 29 Dans l’embarqué

Pas différent Choix large Dépendent de l’implémentation du driver par le fournisseur Attention au restriction sur l’usage et la publication Généralement, fournissent : un driver exposant un /dev/fb et une interface pour la 3D (équivalent DRM) un driver pour Xorg-Xserver implémentant Xrender, EGL et/ou GLX une implémentation de libEGL, libGLES, libOpenVG la Possibilité d’utiliser ces bibliothèques sur /dev/fb et/ou DirectFB

Sysmic - J. Pouiller La pile graphique Linux 20 / 29 Dans l’embarqué

Exemples :

Chip Driver libre Exemples de chipsets Imagination Tech- Apple, Intel Atom (GMA 500/GMA nologies PowerVR 600), Texas Instrument OMAP (PandaBoard), ... ARM Mali Lima Allwinner Sunxi, Samsung Exynos Qualcomm Adreno Freedreno Freescale i.mx51/i.mx53 (AMD), Qualcomm Snapdragon Vivante Etnaviv Freescale imx6 Broadcom Video- Broadcom BCMx (Raspberry Pi) Core Nvidia Tegra Grate Nvidia Tegra Nvidia Nouveau Nvidia Geforce AMD Radeon Radeon AMD Radeon

Sysmic - J. Pouiller La pile graphique Linux 21 / 29 L’accélération du bureau

Possible d’accélérer les application, mais pas encore le bureau dans son ensemble Xgl : DDX s’appuyant sur une fenêtre OpenGL. Chaque fenêtre est rendue dans une texture. Il est alors possible d’appliquer des effets sur ces textures Aiglx : Remplace Xgl (Xgl était critiqué pour son organisation). Les fenêtres sont rendues sur des textures et les appels à GLX sont proxyfiés par AIGLX. Permet en outres aux application distante de faire du rendu OpenGL. Xcompose et Xdamage : extension du protocole X permettant à une application de contrôler l’affichage final des fenêtres (, berryl, , etc...).

Sysmic - J. Pouiller La pile graphique Linux 22 / 29 Accélération 3D

Sysmic - J. Pouiller La pile graphique Linux 23 / 29 Wayland

L’architecture de Xserver date des années 80. L’informatique a beaucoup changé. Xserver est une succession d’extensions et de modifications Wayland est une nouvelle API faisant table rase du passé. Basée sur GLes, EGL, evdev. Wayland est basé sur des buffer dans lesquels les applications font des rendus 2D (comme Xrender) ou 3D (comme GLX). Il est possible à des applications de faire de la composition de ces buffers (comme AIGLX/Xcompose). Weston est implémentation de référence de Wayland Afin de gérer la rétro-compatibilité, XWayland implémente le protocole X au dessus de Wayland

Sysmic - J. Pouiller La pile graphique Linux 24 / 29 Accélération 3D

Sysmic - J. Pouiller La pile graphique Linux 25 / 29 Mir

Mir est un projet concurrent (et controversé) à Wayland Architecture très similaire mais incompatible Sponsorisé par Ubuntu XMir implémente le protocole X sur Mir

Sysmic - J. Pouiller La pile graphique Linux 26 / 29 Les toolkits graphiques

Les toolkits graphiques fournissent les widgets (boutons, menu, zone de texte, etc...) xlib, SDL EFL (widgets) / (rasterization) / pixman (pixel buffers) / pango (text) / freetype (fonts)

Sysmic - J. Pouiller La pile graphique Linux 27 / 29 Les toolkits graphiques

Les toolkits peuvent s’appuyer sur différentes interfaces de bas niveau : Protocole X11 xlib Diverses interfaces sous Windows Xrender (surtout pour le rendu des fonts). Directfb /dev/fb OpenGL Wayland Quartz Html ... Le choix et la bonne utilisation de cette interface sont primordiaux pour la rapidité du système.

Sysmic - J. Pouiller La pile graphique Linux 28 / 29 Les toolkits

Sysmic - J. Pouiller La pile graphique Linux 29 / 29